为什么这个程序的输出变化为130?

6 c

我有以下代码,在我看来它应该总是输入if语句的真实部分,但是,超过120,它似乎开始执行该else子句.为什么会这样?

char x;
for (i=0;i<256;i+=10) {
    x=i;
    if (x==i)
        printf("%d true\n",i);
    else 
        printf("%d false\n",i);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

0 true
10 true
: all numbers from 20 to 100 are true
110 true
120 true
130 false
140 false
: all numbers from 150 to 230 are false
240 false
250 false
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 13

这是因为你使用的是带符号的char,可能是一个整数.

当char达到130(它变为130 - 256)时,char会溢出,但整数不会溢出.130 - 256!= 130.

一个简单的更改修复它,以便结果始终为true - 只需unsigned在第一行添加:

unsigned char x;
for (int i=0;i<256;i+=10)
{
    x=i;
    if (x==i)
        printf("%d true\n",i);
    else 
        printf("%d false\n",i);
}
Run Code Online (Sandbox Code Playgroud)

  • 如果示例代码没有采取大小为10的步骤,那么发生的事情会更加明显,因为它会发生在127/128边界. (3认同)

Jam*_*ris 12

使用char关键字时,默认情况下,编译器可能使用signed char.有符号字符的范围通常为-128到127,而int的范围要大得多.除了典型的台式PC之外,更多深奥的硬件可能会使用其他值.

  • 实际上,为了避免任何歧义,C99要求char必须至少*8位(5.2.4.2.1),并且它确保`int`可以包含从-32767到+32767的所有值.声明"int的范围远大于-128..127"在技术上是正确的. (2认同)