【问题标题】:How is the unsigned and signed long variables compared?如何比较无符号和有符号长变量?
【发布时间】:2014-04-15 10:49:40
【问题描述】:

遇到这个问题时,我一直在准备面试。

#include<stdio.h>
int main()
{

    unsigned long a = 100;
    long b = -1;
    if(b>a)
        printf("YES");
    else
        printf("No");
}

要找到程序的输出。答案是YES 谁能解释一下这是正确的答案吗?我分析发现,当 a 和 b 中的至少一个具有无符号限定符时,答案是肯定的。当两者都很长时,它会打印NO

编辑:

还有一个问题让我想了很多。这是代码

#include<stdio.h>
int main()
{

    float t = 1.0/3.0;
    if(t*3 == 1.0)
        printf("yes");
    else
        printf("no");

}

代码的答案是no,但我无法破译它是如何获得的。另外,当我假设一个变量 a = t*3 并在 if 语句中比较它时,我得到的输出为 yes

我正在尝试学习这些概念。所以请帮助我解释这两个程序如何产生各自的输出。

谢谢

【问题讨论】:

标签: c output


【解决方案1】:

当您进行比较时,编译器必须将两个操作数转换为相同的类型。 转换基于“等级”(大小)和符号。

如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。

您将unsigned longlong 进行比较。根据上面的规则,long b 被转换为unsigned long,得到最大可能的正数。请注意,实际位不会改变。 0xFFFFFFFF 作为 32 位有符号表示 -1。作为 32 位无符号表示 4294967295。

对于浮点数,== 运算符逐位比较浮点数。但是你在除法和乘法过程中失去了一些精度。

【讨论】:

    【解决方案2】:

    由于 C 通常的算术转换&gt; 运算符的两个操作数都转换为单个通用类型。当

    unsigned long a = 100;
    long b = -1;
    

    if 控制表达式:

    b > a
    

    等价于

    (unsigned long) b > a
    

    这里相当于:

    ULONG_MAX > 100UL
    

    因为将-1 转换为unsigned long 计算结果为ULONG_MAX

    【讨论】:

    • 啊..这就解释了第一个问题..非常感谢
    【解决方案3】:

    从通常的算术转换:

    "如果无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则将有符号整数类型的操作数转换为无符号整数类型的操作数的类型。"

    之前:

    unsigned long -- signed long

    100=...0001100100 -1 = ...11111111111

    之后:

    unsigned long -- signed long converted to unsigned long

    100 -- 2^n - 1

    n- 长的位数。

    -1>100 ?不,2^n -1 > 100。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-01-28
      • 2011-07-21
      • 1970-01-01
      • 1970-01-01
      • 2016-08-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多