это можно увидеть. Компилятор жалуется, что у меня есть целочисленное переполнение, но когда я смотрю на правила стандарта 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 - правильное значение для этого выражения! ( См. Ссылку )
Итак, как получается, что программа может выдавать правильное значение при целочисленном переполнении? И что еще более важно, как случилось, что в этом выражении было целочисленное переполнение?