如何比较未签名和签名的长变量?

时间:2014-03-11 17:33:58

标签: c output

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

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

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

找到程序的输出。答案是YES任何人都可以解释一下这是正确的答案吗?我分析并发现,当a和b中的至少一个具有无符号限定符时,答案为YES。当两者都很长时,它会打印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

我正在努力学习这些概念。所以请帮助我解释这两个程序如何产生相应的输出。

由于

3 个答案:

答案 0 :(得分:1)

由于C 通常的算术转换>运算符的两个操作数都转换为单个公共类型。什么时候

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

if控制表达式:

b > a

相当于

(unsigned long) b > a

这相当于:

ULONG_MAX > 100UL

因为将-1转换为unsigned long的评估结果为ULONG_MAX

答案 1 :(得分:1)

进行比较时,编译器必须将两个操作数转换为相同的类型。 转换基于“排名”(大小)和签名。

  

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

您将unsigned longlong进行比较。根据上述规则,long b将转换为unsigned long,从而产生最大可能的正数。注意,实际位不会改变。 0xFFFFFFFF作为32位签名意味着-1。作为32位无符号,它意味着4294967295。

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

答案 2 :(得分:0)

从通常的算术转换:

&#34;如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则带有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型&#34;

之前:

unsigned long -- signed long

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

之后:

unsigned long -- signed long converted to unsigned long

100 -- 2^n - 1

n位长。

-1&gt; 100?不,2 ^ n -1&gt; 100.