C 为什么会出现整数溢出,如何修复?

C 为什么会出现整数溢出,如何修复?,c,overflow,C,Overflow,尝试在我的代码中断中编译以下行: printf("%llu\n", 0x12345678 * 0x12345678); 我明白了: program.c:45:34: warning: integer overflow in expression [-Woverflow] printf("%llu\n", (0x12345678 * 0x12345678)); 如何修复此问题?[接受更正后]注释 在您的计算机上,0x12345678比unsigned long-long窄-当然是si

尝试在我的代码中断中编译以下行:

printf("%llu\n", 0x12345678 * 0x12345678);
我明白了:

program.c:45:34: warning: integer overflow in expression [-Woverflow]
     printf("%llu\n", (0x12345678 * 0x12345678));

如何修复此问题?

[接受更正后]注释

在您的计算机上,
0x12345678
unsigned long-long
窄-当然是
signed long
或者可能是
int


signed long*signed long
仍然是一个
signed long
,可能会出现有符号整数溢出,这是UB。
有符号长
的范围小于
0x12345678*0x12345678
的数学积。通过使用
ULL
后缀,至少可以使用
unsigned long
math完成数学运算


迂腐的注释:当打印可能比
int/unsigned
宽的整数类型时,确保最终计算结果与说明符匹配。考虑到某个BigixFor常数可能比<代码> >未签名的长long < /代码>宽。或者离开,处理潜在的编译器警告

printf("%llu\n", (unsigned long long) (1ULL * SOME_BIG_CONSTANT * SOME_BIG_CONSTANT));
另见

0x12345678*0x12345678
-->
0x12345678ULL*0x12345678
@BLUEPIXY我以前从未见过,但它修复了警告。谢谢。@bjd2385这里的关键是理解C在计算中使用的类型,这是根据操作数的类型确定的。存储最终结果的类型不会影响用于计算的类型。@Lundin这很有意义。尽管我的答案被否决了(毫不奇怪),但我仍然学到了一个重要的概念。
0x12345678
在32位机器上是(有符号的)
int
类型,而不是无符号的。与
0x82345678
不同,它的类型为
unsigned int
@lundin-同意。
printf("%llu\n", (unsigned long long) (1ULL * SOME_BIG_CONSTANT * SOME_BIG_CONSTANT));