2013-12-11 77 views
-2
main() 
{ 
    unsigned x=1; 
    signed char y=-1; 
    if(x>y) 
     printf("x>y"); 
    else 
     printf("x<=y"); 
} 

输出为:X < = Y不理解输出

但我的问题是,在声明无符号X = 1;没有数据类型,如int或char。那么编译器会假设什么?并在char y = -1;这不是一个错误吗?我也想知道程序是如何工作的。

+2

1.'unsigned int'; 2.不,它不是; 3.它工作得很好。 – 2013-12-11 14:09:29

+0

可能的重复:[“unsigned”关键字](http://stackoverflow.com/a/16568382/1825094)(什么'unsigned'没有一个特定的类型是什么意思?) –

+0

将字符分配给我们遵循的变量,即char y = 'Z'。那么如何将-1存储在y中? – user3087840

回答

2
signed char y=-1; 

-1通常存储在2's补码形式,但y被解释为阳性。所以y成为一个非常大的值,它总是大于x


即使它的存储是签+级形式,它仍然是一个非常大的值,如果治疗为阳性。如果解释为正值,则-1的1的补码补码也大于1。

+0

你怎么知道它**会以2的补码存储?它可以存储为1的补码,也可以以符号+幅度表示形式存储。 – 2013-12-11 14:11:22

+0

这些拼写为“解释”和“正面”。用“e”和**一个**“s”。 – 2013-12-11 14:16:08

+0

什么是符号+大小? – user3087840

3

“裸体”unsigned的默认类型是unsigned int

这个比较的结果得益于C的算术升级,在比较之前,这两个参数将转换为>为合适的类型。

+0

转换如何工作 – user3087840

0

这与系统的存储机制有关。

为了简单起见,请检查以下代码,其中o/p以十六进制[直接存储格式]显示。

#include <stdio.h> 
#include <stdlib.h> 

int main() 
{ 
     unsigned int ua = 1; 
     signed int sa = -1; 
     if (ua>sa) 
       printf("ua>sa\n"); 
     else 
       printf("sa>ua\n"); 

     printf("unsigned = 0x%x\t signed = 0x%x\n", ua, sa); 

     return 0; 
} 

输出:

[[email protected] Practice]# ./a.out 
sa>ua 
unsigned = 0x1 signed = 0xffffffff 
[[email protected] Practice]# 

希望这有助于。