2015-06-21 46 views
0
int main() 
{ 
    unsigned long a= 100000; 
    long b = -1; 
    if (b > a) 
     printf("yes\n"); 
    else 
     printf("No\n"); 

    return 0; 
} 

为什么当我们知道100000> -1时输出为“是”。所以,因此它应打印“NO”,但作为一个天真的,我真的可以得到它不明白简单的C程序if/else结果

+0

第一个问题'无效的主要()'是定义'主()'一个非常古老的方式,这意味着你使用的是非常过时的资源。 –

+0

第二个问题:您没有启用警告标志或忽略它们。 –

+0

这应该清除一些东西:http://stackoverflow.com/questions/5416414/signed-unsigned-comparisons – adrian008

回答

5

当你比较longunsigned long那么这两个地转化为unsigned long第一左右(取决于平台)的-1值变为0xFFFFFFFF。那么结果很明显。

+0

值-1如何变成0xFFFFFFFF?对不起@dlask会给出一个要点或任何类型的链接? – SJith

+1

谢谢,我明白了! – SJith

+0

这是所谓的补码 – Pynchia

2

在这一行:

if (b > a) 

你是一个long,这导致了错误的比较unsigned long

简单地改变

unsigned long a= 100000; 

long a= 100000; 
+0

好吧,我明白你的意思,但我想知道** unsigned **是如何使** long **的值小于** long b **? – SJith

+0

@SJith:看,无符号意味着它的值将从0开始,并且不能包含负数。所以当你试图将一个负数转换成一个无符号数时,它会隐式转换成一个非负数。所以,-1会被转换成2^32-1这个大于10000的值,所以你会得到你的输出。 –

+0

谢谢@karma_geek :) – SJith