【问题标题】:bit representation of unsigned int a = -1unsigned int a = -1 的位表示
【发布时间】:2014-11-25 11:05:00
【问题描述】:

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

输出:

是的

【问题讨论】:

  • unsigned 不能为负 :) 当你写下“unsigned”这个词时,你不认为它是什么意思吗?
  • 你的问题的答案已经在你的例子中了。
  • 我的意思是,-1 如何以二进制形式表示。 -1和1相同的逻辑是什么
  • -1 始终是 UMAX 参见 thisthis
  • @larsmans:该语言要求(unsigned)(-1)在所有平台上产生UNIT_MAX,无论是否使用2的共同实现。

标签: c integer-promotion


【解决方案1】:

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

为此初始化

unsigned int x = -1;

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

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

初始化

unsigned int x = -4;

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

【讨论】:

  • 没错。 “当整数类型的值转换为 […] 无符号时,该值通过重复加或减一个新类型可以表示的最大值进行转换,直到该值在新类型的范围内。 ” (C11,§6.3.1.3)。
【解决方案2】:

怎么可能,x 是无符号的

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

欲了解更多信息,请参阅How do promotion rules work when the signedness on either side of a binary operator differ?

【讨论】:

  • @mafso:啊,我的意思是大小相同的类型。具体细节在我添加的链接中。
【解决方案3】:

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

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

第一位0代表整数为正,否则为负,所以它的最大值是0111,即7

所以1可以写成0001

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

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

因此,将这种数据类型设为无符号会将 -1 读取为 15。

【讨论】:

  • 请注意,这仅适用于 2 的补码机器,C 标准不需要。
猜你喜欢
  • 1970-01-01
  • 2021-08-07
  • 1970-01-01
  • 2013-08-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
相关资源
最近更新 更多