Int64_t, он же long long, действует как int32_t и переполняется на 2^31.

c++ data-type print

У меня есть переменная int64_t. Когда я добавляю другую переменную int64_t

и преобразовать его в двойное значение для печати на последовательном мониторе, он действует так, как если бы это была переменная int32_t. Это программа:

int64_t a = 1 << 31;
double b = static_cast<double>(a);
Serial.println(b);

Вывод на серийный монитор: -2147483648.00.

Что происходит?

, 👍1


1 ответ


Лучший ответ:

3

1 << 31 интерпретируется компилятором как (int)1 << (целое) 32. См. неявные типы целочисленных литералов. правила обычных арифметических преобразований гласят, что никакое неявное преобразование выполняется в этом случае. Затем результат вычисляется как int, и он переполняется. Обратите внимание, что это поведение undefined. Назначение int64_t a = ... преобразует (уже переполненный) результат в более широкий тип без изменения его значения.

Возможно, вы захотите написать что-то вроде:

int64_t a = 1LL << 31;
,

даже uint32_t a = 1UL << 31; может интерпретировать 0x80000000 как положительное число. Кстати, на *настоящем* ардуино, где нативным int является int16_t, вы получаете 1<<31 == 0, @DataFiddler