Int64_t, он же long long, действует как int32_t и переполняется на 2^31.
У меня есть переменная int64_t
. Когда я добавляю другую переменную int64_t
и преобразовать его в двойное значение для печати на последовательном мониторе, он действует так, как если бы это была переменная int32_t
. Это программа:
int64_t a = 1 << 31;
double b = static_cast<double>(a);
Serial.println(b);
Вывод на серийный монитор: -2147483648.00
.
Что происходит?
@LukasFun, 👍1
1 ответ
Лучший ответ:
1 << 31
интерпретируется компилятором как (int)1 << (целое) 32
.
См. неявные типы целочисленных литералов.
правила обычных арифметических преобразований гласят, что никакое неявное преобразование
выполняется в этом случае. Затем результат вычисляется как int
, и
он переполняется. Обратите внимание, что это поведение undefined. Назначение
int64_t a = ...
преобразует (уже переполненный) результат в более широкий
тип без изменения его значения.
Возможно, вы захотите написать что-то вроде:
int64_t a = 1LL << 31;
- Есть ли ограничения на размер массива в Arduino Mega 2560?
- Неожиданные результаты при создании 32-битного целого числа из массива байтов
- Создание строк с символами UTF-8 из данных
- Определить, имеет ли переменная арифметический тип
- Каковы размеры каждого примитивного типа данных в SAMD51 Metro M4 Express?
- Использовать библиотеку печати для установки строковой переменной
- Преобразование строки в целое число
- C++ против языка Arduino?
даже uint32_t a = 1UL << 31; может интерпретировать 0x80000000 как положительное число. Кстати, на *настоящем* ардуино, где нативным int является
int16_t
, вы получаете1<<31 == 0
, @DataFiddler