为什么unsigned int x = -1和int y = ~0具有相同的二进制表示?
在以下代码段中将是:
- function的结果
- x的值
- y的价值
{ unsigned int x = -1; int y; y = ~0; if(x == y) 的printf( “同”); 其他 printf(“不一样”); }
一个。 同样,MAXINT,-1 湾 不一样,MAXINT,-MAXINT C。 同样,MAXUINT,-1 d。 同样,MAXUINT,MAXUINT 即 不一样,MAXINT,MAXUINT
有人可以解释我的工作原理或只是解释一下片段吗?
我知道它是关于两个补码n等.MAXINT和-1的意义是什么? 这是因为unsigned int和int的事情 – 我是对的吗?
如果你运行这个程序,你会发现答案是错的 ,c是正确的答案:
#include #include int main() { unsigned int x=-1; int y; y = ~0; if(x == y) printf("same\n"); if(x==INT_MAX) printf("INT_MAX\n"); if(x==UINT_MAX) printf("UINT_MAX\n"); else printf("not same"); return 0; }
unsigned int x=-1;
1
是整数文字,类型为int
(因为它适合int
)。 一元-
应用于int
不会导致进一步提升,因此-1
是值为-1
的int
。
当转换为unsigned int
modulo时,使用2 ^ N算术,其中N是unsigned int
的值位数。 x
的值为2 ^ N – 1,即UINT_MAX
(什么是MAX_UNIT
?)。
int y; y = ~0;
同样0
是int
类型,在C中所有允许的int
表示必须具有一个int
所有值位,表示0为0.再次没有促进一元促进~
所以~0
是一个int
,所有值位为1.它是什么value是依赖于实现的,但它是负的(符号位将被设置),所以绝对不是UINT_MAX
或INT_MAX
。 该值存储在y
不变。
if(x == y) printf("same"); else printf("not same");
在此比较中, y
将被转换为unsigned int
,以便与已经是unsigned int
x
进行比较。 由于y
具有实现值,因此转换为unsigned int
后的值仍然是实现定义的(尽管转换本身是模2 ^ N且已完全指定)。 比较的结果仍然是实现定义的。
总之:
实现定义,
UINT_MAX
,实现定义
在实践中补充:
不一样,
UINT_MAX
,-0(又名0)
标志加幅度:
不一样,
UINT_MAX
,INT_MIN
两个补码:
同样,
UINT_MAX
,-1
它非常简单。 -1的二进制补码表示为0xFFFFFFFF。 因此,这就是x包含的内容。
补码运算符(〜)翻转所有位。 所以0的补码是32位数,所有位都设置为1或0xFFFFFFFF。
编辑:正如他在评论中指出的那样。 答案不是A.如果是,则说0x7FFFFFFF和0xFFFFFFFF是相同的。 他们不是。 真正的答案是C(假设MAXUNIT是拼写错误;))。
这是因为两个补充
位的翻转导致匹配-1的位模式
因为在第一个unsigned int中,你输入-1,但是从unsigned int的角度来看它是0xFFFFFFFF(这是负整数存储到计算机中的方式); 在第二种情况下,按位不会完全不查看“种类”并将“变换”0变为1而反之亦然,因此0的所有0都变为1(查看位),因此您获得0xFFFFFFFF。
接下来的问题是,为什么将无符号整数与有符号整数进行比较并不能区分它们? (数值上4294967295当然不等于-1,即使它们在计算机中的表示是相同的)。 事实上它可以,但显然C并没有强制要求这样的区别,而且它是“自然的”,因为处理器不能自己做(我不确定这最后一句话总是如此,……但是它适用于大多数处理器):要考虑到asm中的这种区别,您必须添加额外的代码。
从C的角度来看,您必须决定是将int转换为unsigned int,还是将int转换为unsigned int。 但是当然,负数不能转换为无符号数,而另一方面,无符号数可能导致溢出(例如,对于4294967295,您需要64位寄存器(或33位寄存器!)才能有它仍然能够计算其负值)…
因此,最自然的事情是避免奇怪的转换,并允许“cpu like”比较,在这种情况下导致0xFFFFFFFF(32位为-1)与0xFFFFFFFF(32位为0)相同,更多在genereal中可以被认为是MAXUINT(可以保持的最大无符号整数),另一个是-1。 (看看你的机器limits.h
包括检查)