这个问题在这里已经有答案了:
什么是“2的补码”(23个答案)
两年前关门了。
我在java中测试按位not运算符。我用二进制打印了~1的结果,结果返回“11111111111111111111111111111111111111111110”,其值显然是-2。
我知道你必须加1才能得到-1,最左边的一位只显示这个数是正还是负,但我不明白的是,为什么一个二进制数那么大,有那么多的1,计算结果只有-2。
这个问题在这里已经有答案了:
什么是“2的补码”(23个答案)
两年前关门了。
我在java中测试按位not运算符。我用二进制打印了~1的结果,结果返回“11111111111111111111111111111111111111111110”,其值显然是-2。
我知道你必须加1才能得到-1,最左边的一位只显示这个数是正还是负,但我不明白的是,为什么一个二进制数那么大,有那么多的1,计算结果只有-2。
3条答案
按热度按时间uxhixvfz1#
是二的补码。如果要将数字转换为tc(以2为例):
把它写成二进制(假设它只有8位表示一个较短的表示)
对所有位求反
添加1
这就是为什么2看起来像那样。
ki1q1bka2#
11111111111111111111111111111110
是原始位表示。java使用2的补码表示有符号值,其中第一位(如果设置)表示负数。这可以通过两个补码的转换得到很好的解释:
以数字0xffffff为例。在二进制中,即:
1111 1111 1111 1111 1111 1111 1111 1111
关于这个号码我们能说些什么?它的第一位(最左边的)是1,这意味着它代表一个负数。这就是事物在二的补码中的方式:前导1表示数字为负,前导0表示数字为0或正。为了知道这个数字是什么的负数,我们把这个数字的符号倒过来。但是怎么做呢?课堂笔记说(在3.17)要反转符号,你只需反转位(0变为1,1变为0),然后在得到的数字上加一。
显然,二进制数的倒数是:
0000 0000 0000 0000 0000 0000 0000 0000
然后我们加一个。0000 0000 0000 0000 0000 0000 0000 0001
所以,负的0xFFFFFFFF
是0x00000001
,通常称为1
. 所以呢0xFFFFFFFF
是-1
.上面说明了为什么2的补码中的负数是
0xFFFFFFFF
是1
这就意味着0xFFFFFFFF
手段-1
. 以同样的方式你的价值0xFFFFFFFE
有否定的2
所以它本身0xFFFFFFFE
手段-2
二的补码。cetgtptt3#
另一种思考方法是,在32位有符号整数中,最左边的数字表示两个数字中的一个:
根据定义。其他一切都是对这一点的补充,因此:
将最左边的(前导)位视为定义从何处开始计数是很有帮助的:
如果最左边的位是0,则从0开始计数
如果最左边的位是1,则从-2147483648开始计数
它右边的其余31位通过组成一个数字(最多为2147483647)来定义整数值本身
111 1111 1111 1111 1111 1111 1111
)这是加在起点上的。有效地说,有符号整数环绕。它们的最大值约为20亿,然后立即翻到-20亿,再数到0:
0111111111111111111111111111111
是2147483647。如果再加上一个,你会得到:1000000000000000000000000000000
它要么是2147483648,作为一个无符号整数,要么是-2147483648,根据定义是这样的。当您不断添加到任何整数时,它会接近:1111111111111111111111111111111
有符号整数为-1,无符号整数为4294967295最后,您应该理解并理解,如果您不断地向有符号整数相加,它们会自动环绕,但它们会立即从最大正值跳到中间的最小负值:
这就是为什么您的'1111111111111111111111111111111 0'是-2,因为它比最大二进制表示法(在有符号整数空间中表示-1)小1