взгляните на это. Компилятор жалуется, что у меня переполнение целого числа, но когда я смотрю на правила стандарта C89 для интегрального продвижения вместе со значениями в этом выражении, мне кажется, что переполнения нет.
rutski@imac:~$ cat test.c
#include <stdio.h>
#include <inttypes.h>
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 является правильным значением для этого выражения! ( см. Ссылку )
Итак, как получается, что программа может выдавать правильное значение при переполнении целого числа? И что более важно, как получилось, что в этом выражении началось целочисленное переполнение?