對此有一個窺視。編譯器抱怨說我有一個整數溢出,但是當我查看C89標準的整數提升規則以及該表達式中的值時,似乎沒有溢出。C積分溢出?
[email protected]:~$ 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;
}
[email protected]:~$ 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
[email protected]:~$ ./a.out
value = 2661195264
[email protected]:~$
此外,谷歌確認2661195264的答案是該表達的正確值! (See this link)
那麼,程序如何在有整數溢出時產生正確的值?更重要的是,該表達式中的整數溢出是如何開始的?
也許它使用signed int而不是unsigned,那麼儘管計算了正確的無符號值,但在簽名操作中會發生溢出。 – Nobody