【问题标题】:Why the control goes to the else block for this conditional check? [duplicate]为什么控件转到 else 块进行此条件检查? [复制]
【发布时间】:2019-12-02 13:47:31
【问题描述】:

我想知道为什么它只执行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");
}

【问题讨论】:

  • 为什么投反对票?除了糟糕的格式之外,这是很好的呈现和回答,当你第一次遇到这种情况时真的很困惑。
  • @SanderDeDycker:我的直觉告诉我这个有重复,而且问题中也没有什么特别之处可以保证一个全新的答案,这就是我没有回答的原因。就我个人而言,我认为应该可以对重复发现者的行为进行投票和反对。
  • (记录在案,我不是投反对票的人——我同意投反对票没有必要的观点)

标签: c unsigned-integer


【解决方案1】:

此声明

  if(a>b)

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

因此,条件看起来像

if (100 > 4294967196)

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

【讨论】:

  • 可能不是 4294967196
  • @Bathsheba 对,我假设是 4 字节 int,我会添加它。
  • 你是个好蛋!
【解决方案2】:

发生这种情况是因为值 -100 正在转换为较大的正值。

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

C standard 的第 6.3.1.8p1 节详细说明了这些转换:

如果两个操作数的类型相同,则不再进行转换 需要。

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

否则,如果无符号整数类型的操作数有 等级大于或等于其他类型的等级 操作数,则带符号整数类型的操作数为 转换为无符号整数的操作数类型 输入。

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

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

突出显示的段落适用于这种情况。至于实际转换是如何发生的,在第 6.3.1.3p2 节中有详细说明:

否则,如果新类型是无符号的,则在新类型可以表示的最大值的基础上反复加减一,直到该值在新类型的范围内。

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

【讨论】:

  • 你不介意我的编辑,所以我可以问心无愧地投赞成票?
  • @Bathsheba 没问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-17
  • 1970-01-01
  • 2020-09-28
  • 2012-10-18
  • 1970-01-01
相关资源
最近更新 更多