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,
             b = 0xFFFF;
    uint64_t c = a * b;
    printf("%" PRIX64 "\n", c);
    return 0;
}

Практика показывает:

$ ./test
FFFFFFFFFFFE0001

С учетом продвижения интегральных типов до int результат будет вычисляться так:

uint64_t c = (uint64_t)(int)((int)a * (int)b);

(int)0xFFFF * (int)0xFFFF даст отрицательное число 0xFFFE0001 (если int - 32 бита), которое потом знакорасширится в 64 бита: 0xFFFFFFFFFFFE0001