我尝试过较旧的帖子,但无法理解以下行为
https://stackoverflow.com/questions/12295168/c-signed-unsigned-mismatch
unsigned int and signed char comparison
#define T long
int main()
{
unsigned T a;
T b;
a=1;
b=-1;
if(a>b)
printf("True\n");
else
printf("False\n");
return 0;
}
我在T = char,short int和long上尝试了上面的代码 观察到的char和short的输出为TRUE,而int和long的输出为FALSE。我在Ubuntu gcc上尝试了上面的代码 谁能解释一下,为什么我会为不同的数据类型获得不同的输出?
答案 0 :(得分:3)
根据b
和char
的签名short
值进行测试时,该值会扩展为int
,这会复制符号位,而{{1} }值不会复制已签名的位。
因此,对于a
,if变为char
并且这是真的(假设32位if (0x00000001 > 0xFFFFFFFF)
)。
但是当使用int
或更大的unsigned
时,测试是使用无符号比较完成的。
答案 1 :(得分:1)
char
会提升为int
。
让我们看看char
类型下面发生了什么:
a
被提升为int
并保持为1. b
也会提升为int
,该符号会被保留,并且仍会保留为{{ 1}}。是1> -1?是的!
那么-1
类型:
由于涉及所有int
操作数,所有操作数都将转换为unsigned
。如果unsigned
已经是无符号的,则保留原样1。但是,a
已签名,因此我们需要丢失该符号。
由于底层位表示,在32位机器上,-1实际上与4294967295具有相同的位。如果1大于4294967295,你最终会比较。我认为答案很明显。