为何控件进入此条件检查的else块?

问题描述 投票:2回答:2

我想知道为什么它只执行else语句

下面给出代码:

#include<stdio.h>
int main()
{
    unsigned int a = 100;
    int b = -100;
    if(a > b)
    {
        print("Obviously 100 is Bigger than -100!\n");
    }
    else
        print("Something Unexpected has Happened\n");
}
c unsigned-integer
2个回答
6
投票

此声明

  if(a>b)

涉及有符号和无符号整数之间的运算(比较),根据升级规则,有符号整数将被提升为无符号整数并产生巨大的无符号值:例如,在具有32位整数的环境中,该值为4294967196(2 32-100)。

因此,条件看起来像

if (100 > 4294967196)

并且将评估为false,确保执行了else块中的代码。


0
投票

发生这种情况是因为值-100被转换为非常大的正值。

您看到的是通常的算术转换的结果。当在表达式中使用具有相同秩的有符号整数值和无符号整数值(在这种情况下为intunsigned int)时,有符号值将转换为无符号值。

这些转换在C standard的6.3.1.8p1节中有详细说明:

如果两个操作数具有相同的类型,则不会进行进一步的转换需要。

否则,如果两个操作数都具有符号整数类型或都具有无符号整数类型,较小的操作数类型整数转换等级转换为操作数的类型排名更高。

否则,如果具有无符号整数类型的操作数具有等级大于或等于另一个类型的等级操作数,则带符号整数类型的操作数为用无符号整数转换为操作数的类型类型。

否则,如果带符号整数类型的操作数的类型可以用无符号表示操作数类型的所有值整数类型,则无符号整数类型的操作数为转换为带符号整数类型的操作数的类型。

否则,两个操作数都将转换为无符号与带符号的操作数类型相对应的整数类型整数类型。

突出显示的段落在这种情况下适用。至于实际转换的方式,请参见第6.3.1.3p2节中的说明:

否则,如果新类型是无符号的,则通过重复添加或减去新类型所能代表的最大值,直到该值在新类型的范围内,来转换值。

因此,假设unsigned int的大小为32位,没有填充字节,则它可以容纳的最大值为4294967295。这意味着将值-100转换为值4294967196。这意味着实际执行的比较是100 > 4294967295为假,因此将执行语句的else部分。

© www.soinside.com 2019 - 2024. All rights reserved.