首页 文章

C中的未签名和签名行为

提问于
浏览
-3

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

  • 1

    当针对 charshort 的已签名 b 值进行测试时,该值会扩展为 int ,这会复制符号位,而对于 a 值,则不会复制已签名位 .

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

    但是当使用 int 或更大的 unsigned 时,测试是使用无符号比较完成的 .

  • 3

    char 在您比较两个变量的情况下被提升为 int .

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

    a 被提升为 int 并保持为1. b 也被提升为 int ,该符号被保留,并且它也保持为 -1 . 1> -1?是!

    那么 int 类型怎么样:

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

    由于基础位表示,在32位机器上,-1实际上具有与4294967295相同的位 . 并且最终比较如果1大于4294967295.我认为答案是显而易见的 .

相关问题