为什么下面的代码不打印测试?

Sab*_*ina -1 c

为什么下面的代码不显示输出.它为什么不进行算术转换:

#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)

int*_*jay 5

表达式b+1是溢出,因为2147483647是signed int的最大值(假设为32位整数).溢出已签名的表达式是未定义的行为,因此您无法推断在此之后发生的任何事情.

如果你投bunsigned int增加它之前,它应该正常工作.

参考:C11 6.5/5:

如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义.