Меня укусило неожиданное целочисленное повышение, и я удивился. Является ли согласованным в разных компиляторах, происходит ли повышение до явного приведения?
Позвольте мне объяснить.Имея 8-битную переменную со знаком, такую как
int8_t s8a = -128; //<-- 0x80
Присвоение беззнаковому 16 как uint16_t s16b = s8a + 1;
Я бы ожидал повышения до целого числа 0xFF81
, тогда назначенного, это обычнаяпроисходит неправильно и рассматривается в таких документах, как MISRA C. Но явное приведение к типу без знака таким образом, как uint16_t s16b = (uint16_t)s8a
Я бы ожидал, что s8a
немедленно потеряет свою "подпись", а затем простирается с нуля до 16 бит, чтобы дать 0x0080
но на самом деле происходит обратное, так как он получает расширенный знак , а затем теряет свою подпись при приведении и назначении, давая 0xFF80
.
Является ли это поведение стандартным или другим неопределенным поведением C?