3

unsigned int x =-1; Can we assign unsigned int with a negative integer的位表示形式是什么?

#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");
}

输出:

真的

4

3 回答 3

6

当一个unsigned int值与值进行比较时int,该int值被隐式转换为unsigned int类型。该转换的结果与模 2 N的原始值一致,其中是 中的值形成位数。这个模等于。Nunsigned intUINT_MAX + 1

为此初始化

unsigned int x = -1;

用一些与模一致x的无符号值初始化。顺便说一句,这只不过是。该值在对象的每个值形成位中都有。它适用于任何无符号类型。-1UINT_MAX + 1UINT_MAX1unsigned int

表达式~0在类型域中计算signed int,然后在比较y中隐式转换为。显然,在您的平台上,转换产生相同的值,所有值形成位都设置为. 因此平等。unsigned intx == yunsigned int1

初始化

unsigned int x = -4;

用一些与模一致x的无符号值初始化。相比之下,右侧通过相同的规则转换为无符号类型。因此平等。-4UINT_MAX + 1x == -4

于 2014-09-30T18:13:04.683 回答
2

怎么可能,x 是无符号的

这是“通常的算术转换”——两边的操作数==具有不同的类型,因此必须先将它们转换为相同的类型。当类型仅通过符号不同时,int 或更大类型的规则是无符号获胜,因此这将转换-4为无符号等效值,就像分配给-4无符号整数时所做的那样。

有关更多信息,请参阅当二元运算符任一侧的符号不同时提升规则如何工作?

于 2014-09-30T18:29:46.730 回答
0

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

假设我们有一个 4 位的数据类型。

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

所以1可以写成0001

而对于 -1,它必须写成它的 2 的补码,因为它是负数;

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

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

于 2014-10-05T06:22:12.470 回答