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");
}
输出:
真
答案 0 :(得分:6)
将unsigned int
值与int
值进行比较时,int
值会隐式转换为unsigned int
类型。该转换的结果是congruent到原始值2 N ,其中N
是unsigned int
中的值形成位数。此模数等于UINT_MAX + 1
。
出于这个原因初始化
unsigned int x = -1;
使用一些无符号值congruent将x
初始化为-1
模UINT_MAX + 1
。顺便说一下,这只不过是UINT_MAX
。该值在1
个对象的每个值形成位中都有unsigned int
。它以任何无符号类型的方式工作。
在~0
类型的域中评估表达式signed int
,然后在y
比较中将unsigned int
隐式转换为x == y
。显然,在您的平台上,转换产生相同的unsigned int
值,所有值形成位设置为1
。因此平等。
初始化
unsigned int x = -4;
使用一些无符号值congruent将x
初始化为-4
模UINT_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。