无符号int的位表示a = -1

时间:2014-09-30 18:07:43

标签: c integer-promotion

unsigned int x =-1;的位代表是什么 我们可以使用负整数分配unsigned int吗?

#include<stdio.h> 
int main(){
    unsigned int x = -1; 
    int y = ~0; 
    if(x == y) 
        printf("same"); 
    else
        printf("not same"); 
    return 0;
}

输出:

  

相同

怎么可能,x是无符号的

#include<stdio.h> 

int  main()     
{

unsigned int x = -4; 
if (x == -4)
   printf("true");
else 
   printf("FALSE");
}

输出:

  

3 个答案:

答案 0 :(得分:6)

unsigned int值与int值进行比较时,int值会隐式转换为unsigned int类型。该转换的结果是congruent到原始值2 N ,其中Nunsigned int中的值形成位数。此模数等于UINT_MAX + 1

出于这个原因初始化

unsigned int x = -1;

使用一些无符号值congruentx初始化为-1UINT_MAX + 1。顺便说一下,这只不过是UINT_MAX。该值在1个对象的每个值形成位中都有unsigned int。它以任何无符号类型的方式工作。

~0类型的域中评估表达式signed int,然后在y比较中将unsigned int隐式转换为x == y。显然,在您的平台上,转换产生相同的unsigned int值,所有值形成位设置为1。因此平等。

初始化

unsigned int x = -4;

使用一些无符号值congruentx初始化为-4UINT_MAX + 1。在比较x == -4中,右侧通过相同的规则转换为无符号类型。因此平等。

答案 1 :(得分:2)

  

怎么可能,x是无符号的

这是&#34;通常的算术转换&#34; - ==两侧的操作数具有不同的类型,因此必须先将它们转换为相同的类型。当类型仅由signedness不同时,int或更大类型的规则是unsigned wins,因此这会将-4转换为无符号等效值,就像将-4分配到无符号整数时一样

有关详细信息,请参阅How do promotion rules work when the signedness on either side of a binary operator differ?

答案 2 :(得分:0)

in int负整数存储在2的补码中。

假设我们的数据类型为4位。

第一位0表示整数为正,否则为负,因此其最大值为0111,即7

所以1可以写成0001

和-1,它必须用2的补码写,因为它是负的;

-1 =〜(0001)+1 =(1110)+ 1 = 1111;

所以使这个数据类型无符号读-1为15。