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

时间:2017-03-13 23:38:09

标签: c

为什么下面的代码不显示输出。它为什么不做算术转换:

#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

2 个答案:

答案 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而不调用整数溢出并导致未定义的行为的原因。

你应该做的是:

  • 将您的变量转换为 unsigned int
  • 在数字的末尾添加“u”,例如2147483648u