-3

我尝试了较旧的帖子,但无法理解以下行为。
https://stackoverflow.com/questions/12295168/c-signed-unsigned-mismatch
unsigned int 和 signed char 比较

#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 中尝试了上面的代码。
谁能解释一下,为什么我会为不同的数据类型得到不同的输出?

4

2 回答 2

3

当针对有符号b值进行测试时charshort该值会扩大到 an int,这会复制符号位,而对于a值,则不会复制有符号位。

因此对于charif 变为if (0x00000001 > 0xFFFFFFFF)并且这是真的(假设是 32 位int)。

但是当使用一个unsignedint更大的值时,测试是使用无符号比较完成的。

于 2013-07-10T05:26:46.447 回答
1

charint在您比较两个变量的情况下被提升为。

让我们看看char类型下面会发生什么:

a被提升为 anint并且它仍然是 1.b也被提升为 an int,符号被保留并且它也仍然是-1. 1 > -1?是的!

那么int类型呢:

由于unsigned涉及操作数,因此所有这些都将转换为unsigned. 在a已经无符号的情况下,1 保持原样。但是,b已签名,因此我们需要丢失该符号。

由于底层位表示,在 32 位机器上,-1 实际上与 4294967295 具有相同的位。你最终会比较 1 是否大于 4294967295。我认为答案很明显。

于 2013-07-10T05:35:29.787 回答