C Integral Overflow?

это можно увидеть. Компилятор жалуется, что у меня есть целочисленное переполнение, но когда я смотрю на правила стандарта C89 для интегрального продвижения вместе со значениями в этом выражении, мне кажется, что переполнения нет.

rutski@imac:~$ cat test.c 
#include 
#include 

const uint32_t value =
    (0x7F-0x00 + 1) * (256 + 256*256 + 256*256*256) +
    (0xDF-0xC2 + 1) * (256 + 256*256 + 256*256*256);

int
main(void)
{
    printf("value = %"PRIu32"\n", value);
    return 0;
}
rutski@imac:~$ gcc -std=c89 -pedantic -Wall -Wextra test.c
test.c:5: warning: integer overflow in expression
test.c:6: warning: integer overflow in expression
test.c:6: warning: overflow in constant expression
rutski@imac:~$ ./a.out 
value = 2661195264
rutski@imac:~$ 

Более того, Google подтверждает, что ответ 2661195264 - правильное значение для этого выражения! ( См. Ссылку )

Итак, как получается, что программа может выдавать правильное значение при целочисленном переполнении? И что еще более важно, как случилось, что в этом выражении было целочисленное переполнение?

8
задан fieldtensor 7 July 2011 в 19:49
поделиться