看看这个。编译器提示我有整数溢出,但是当我查看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的答案是该表达式的正确值! (See this link)
那么,整数溢出时程序如何产生正确的值呢?更重要的是,该表达式中的整数溢出是怎么开始的?
最佳答案
(0x7F-0x00 + 1) * (256 + 256*256 + 256*256*256)
具有值
2155905024
;可表示的最大(签名的 32位int
)是2147483647
,因此您确实产生了溢出。无论如何,它恰好给了您预期的结果(您很幸运)。请注意,由于没有字面量都带有后缀,因此整个初始化程序的签名类型为,类型为(特别是类型
int
)。将该表达式评估为有符号的int,然后将结果值转换为无符号的整数。