我尝试过较旧的帖子,但无法理解以下行为 .
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中尝试了上面的代码 .
谁能解释一下,为什么我会为不同的数据类型获得不同的输出?
2 回答
当针对
char
和short
的已签名b
值进行测试时,该值会扩展为int
,这会复制符号位,而对于a
值,则不会复制已签名位 .因此,对于
char
,if变为if (0x00000001 > 0xFFFFFFFF)
并且这是真的(假设32位int
) .但是当使用
int
或更大的unsigned
时,测试是使用无符号比较完成的 .char
在您比较两个变量的情况下被提升为int
.让我们看看
char
类型下面发生了什么:a
被提升为int
并保持为1.b
也被提升为int
,该符号被保留,并且它也保持为-1
. 1> -1?是!那么
int
类型怎么样:由于涉及
unsigned
操作数,所有这些操作数都将转换为unsigned
. 在a
的情况下,已经无符号1保留原样 . 但是,b
已签署,因此我们需要丢失该标志 .由于基础位表示,在32位机器上,-1实际上具有与4294967295相同的位 . 并且最终比较如果1大于4294967295.我认为答案是显而易见的 .