uint32_t a = 0xFF << 8;
uint32_t b = 0xFF;
uint32_t c = b << 8;
Я компилирую для Uno (1.0.x и 1.5), и кажется очевидным, что ‘a’ и ‘c’ должны иметь одинаковое значение, но они не … по крайней мере, при работе на цели. Я компилирую тот же код на хосте и не имею проблем.
Сдвиг вправо работает нормально, сдвиг влево работает только тогда, когда я смещаю переменную против постоянной.
Кто-нибудь может это подтвердить?
Я использую Visual Micro с VS2013. Компиляция с 1.0.x или 1.5 arduino приводит к той же ошибке.
[РЕДАКТИРОВАТЬ]На цель:
A = 0xFFFFFF00
C = 0x0000FF00
Проблема связана с неявным приведением со знаком / без знака.
С uint32_t a = 0xFF << 8;
ты имеешь в виду
0xFF
объявлен; это signed char
;0xFFFFFFFF
;a = 0xFFFFFF00
,Если вы хотите воспроизвести то же поведение, попробуйте этот код:
uint32_t a = 0xFF << 8;
uint32_t b = (signed char)0xFF;
uint32_t c = b << 8;
Serial.println(a, HEX);
Serial.println(b, HEX);
Serial.println(c, HEX);
Результат
FFFFFF00
FFFFFFFF
FFFFFF00
Или, наоборот, если вы пишете
uint32_t a = (unsigned)0xFF << 8;
Вы получаете это a = 0x0000FF00
,
Есть только две странные вещи с компилятором:
uint32_t a = (unsigned char)0xFF << 8;
возвращает = 0xFFFFFF00uint32_t a = 0x000000FF << 8;
также возвращает a = 0xFFFFFF00.Может быть, это неправильное приведение в компиляторе ….
Использование оператора приведения, чтобы заставить компилятор обрабатывать 0xFF как uint32_t решает проблему. Похоже, что xduiler Arduino обрабатывает константы немного по-другому, так как я никогда не читал до смены.
Спасибо!