C中的未签名和签名行为

时间:2013-07-10 04:58:28

标签: c

我尝试过较旧的帖子,但无法理解以下行为   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 个答案:

答案 0 :(得分:3)

根据bchar的签名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,你最终会比较。我认为答案很明显。