Используя Microchip XC8, у меня есть конструкция
int16_t test;
uint8_t msb = 0xff;
uint8_t lsb = 0xf4;
uint8_t hyst = 0xff;
test = ((((int16_t)msb)<<8) + (int16_t)lsb) + (int8_t)hyst);
Я ожидаю, что тест будет -13 (oxFFF3), так как я использовал числа со знаком, но он рассчитывается как 0xF3.
Почему?
Изменить: попробовал с gcc, и результат такой, как я ожидал.
int
равно 16 битам из-за сдвига влево. Что такоеsizeof(int)
? - person interjay   schedule 25.11.2015((int16_t)msb)
на((uint16_t)msb)
, вы избавитесь от неопределенного поведения, хотя оно по-прежнему будет определяться реализацией. - person interjay   schedule 25.11.2015int16_t
является избыточным и просто снижает читаемость, потому что эти значения все равно будут повышены до int. - person phuclv   schedule 25.11.2015