为什么下面的代码不显示输出.它为什么不进行算术转换:
#include <stdio.h>
int main(void)
{
int b=2147483647;
if((b+1)==2147483648u)
{
printf("TEST\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是
printf("%d\n",b+1); // shows -2147483648
printf("%u\n",(unsigned int)b+1); // shows 2147483648
Run Code Online (Sandbox Code Playgroud)
表达式b+1是溢出,因为2147483647是signed int的最大值(假设为32位整数).溢出已签名的表达式是未定义的行为,因此您无法推断在此之后发生的任何事情.
如果你投b以unsigned int增加它之前,它应该正常工作.
参考:C11 6.5/5:
如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.