Arduino левый сдвиг не работает, как ожидалось, ошибка компилятора?

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

0

Решение

Проблема связана с неявным приведением со знаком / без знака.

С uint32_t a = 0xFF << 8; ты имеешь в виду

  • 0xFF объявлен; это signed char;
  • Eсть << операция, так что переменная преобразуется в int. Поскольку это был символ char со знаком (и поэтому его значение равно -1), он дополняется 1, чтобы сохранить знак. Таким образом, переменная 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,

Есть только две странные вещи с компилятором:

  1. uint32_t a = (unsigned char)0xFF << 8; возвращает = 0xFFFFFF00
  2. uint32_t a = 0x000000FF << 8; также возвращает a = 0xFFFFFF00.

Может быть, это неправильное приведение в компиляторе ….

1

Другие решения

[Кредит идет к Матсу Петерссону]

Использование оператора приведения, чтобы заставить компилятор обрабатывать 0xFF как uint32_t решает проблему. Похоже, что xduiler Arduino обрабатывает константы немного по-другому, так как я никогда не читал до смены.

Спасибо!

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector