c and small ints
December 17, 2010
Задал мне сегодня друг веселую задачку:
uint16_t a = 0xFFFF, b = 0xFFFF; uint64_t c = a * b;
Что будет в ‘c’ при выполнении этого кода?
Он же и сказал правильный ответ:
#include <inttypes.h>
#include <stdio.h>
int main()
{
uint16_t a = 0xFFFF,
= 0xFFFF;
b uint64_t c = a * b;
("%" PRIX64 "\n", c);
printfreturn 0;
}
Практика показывает:
$ ./test
FFFFFFFFFFFE0001
С учетом продвижения интегральных типов до int оно как ни странно будет вычисляться так:
uint64_t c = (uint64_t)(int)((int)a * (int)b);
(int)0xFFFF * (int)0xFFFF даст отрицательное число 0xFFFE0001 (если int - 32 бита), которое потом знакорасширится в 64 бита: 0xFFFFFFFFFFFE0001