Не ясно, что типа variable
.Без этого мы можем только строить предположения.
Но в целом следует избегать сдвига битов в целочисленных типах со знаком, так как это приводит к различным формам плохо определенного поведения.Это, в свою очередь, означает, что вы также должны быть осторожны с маленькими целочисленными типами, потому что они переводятся в число со знаком int
.См. Неявные правила продвижения типов .
Конкретный случай (uint8)((variable >> 8) & 0xFFu);
безопасен, если variable
не подписано.В противном случае это небезопасно, поскольку смещение вправо отрицательного значения приводит к поведению, определяемому реализацией (арифметическое или логическое смещение).
variable << 8
вызовет неопределенное поведение в 16-битных системах в случае, если variable
является небольшимцелочисленный тип или int16_t
.
Таким образом, самый безопасный, самый переносимый способ независимо от смещения влево / вправо:
chunk_lsb = variable;
chunk_msb = ((unsigned int)variable >> 8);
Хотя вам может потребоваться слишком явный порядокотключить все предупреждения компилятора:
chunk_lsb = (uint8_t) (variable & 0xFFu);
chunk_msb = (uint8_t) ( (unsigned int)variable>>8 & 0xFFu );