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;这不是一个错误吗?我也想知道该计划是如何运作的。
答案 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]#
希望这有帮助。