不理解输出

时间:2013-12-11 14:07:47

标签: c

main()
{
    unsigned x=1;
    signed char y=-1;
    if(x>y)
        printf("x>y");
    else
        printf("x<=y");
}

输出为:x&lt; = y

但我的问题是声明unsigned x = 1;没有数据类型,如int或char。那么编译器会假设什么呢?并在声明中签名char y = -1;这不是一个错误吗?我也想知道该计划是如何运作的。

3 个答案:

答案 0 :(得分:3)

“裸”unsigned的默认类型为unsigned int

由于C的算术促销,比较有效,在进行比较之前,它会将两个参数转换为>到合适的类型。

答案 1 :(得分:2)

signed char y=-1;

-1通常以2's补码形式存储,但y被解释为正数。因此y变为非常大的值,始终大于x


即使它存储的是符号+幅度形式,如果被视为正数,它仍然是一个非常大的值。如果被解释为正值,1的1的补数补集也大于1。

答案 2 :(得分: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;
}

输出:

[sourav@localhost Practice]# ./a.out 
sa>ua
unsigned = 0x1   signed = 0xffffffff
[sourav@localhost Practice]#

希望这有帮助。