为什么下面的代码不显示输出。它为什么不做算术转换:
#include <stdio.h>
int main(void)
{
int b=2147483647;
if((b+1)==2147483648u)
{
printf("TEST\n");
}
return 0;
}
这是
printf("%d\n",b+1); // shows -2147483648
printf("%u\n",(unsigned int)b+1); // shows 2147483648
答案 0 :(得分:5)
表达式b+1
是溢出,因为2147483647是signed int的最大值(假设是32位整数)。溢出已签名的表达式是未定义的行为,因此您无法推断在此之后发生的任何事情。
如果您在递增之前将b
投射到unsigned int
,它应该可以正常工作。
参考:C11 6.5 / 5:
如果是 特殊情况 在评估表达式期间(即,如果是 结果不是数学定义的,也不是在其可表示值的范围内 类型),行为未定义。
答案 1 :(得分:0)
2147483647是可以存储在int数据类型变量中的最大数字,因为有符号整数变量具有分配给它的32位内存。最后一位,即第32位,被分配给该号码的符号。因此,这意味着您只为该数字本身分配了31位内存,使得最大数字为2 ^ 31,即2147483647。
执行2147483648,大于2147483647,称为整数溢出,这将导致未定义的行为。
当您执行2147483648u时,将数字存储为无符号数,因此取消分配最初用于符号的32位,以存储数字。这意味着您现在可以存储最大的数字:2 ^ 32,等于4294967296.这就是为什么现在可以存储2147483648而不调用整数溢出并导致未定义的行为的原因。
你应该做的是: