Использование gcc версии 4.8.4 для Linux, короткий 16 бит, а int 32 бит.
#include "stdio.h"
int main( void ){
unsigned short u = 0xaabb;
unsigned int v = 0xaabb;
printf ("%08x %08x\n", u, (unsigned short)((u*0x10001)/0x100));
printf ("%08x %08x\n", v, (unsigned short)((v*0x10001)/0x100));
return 0;
}
Результат:
0000aabb 0000bbab
0000aabb 0000bbaa
Это может быть изменено, например, путем деления на 0x10, что дает аналогичный результат (+1) для первого случая. Эффект не возникает, если байт, усеченный на /0x100
, меньше 0x80. Машинный код для первого случая (short u
) выглядит так, как будто предполагается округление (добавление 0xFF).
- В чем причина результата или это ошибка?
- Каков результат для других компиляторов?