111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111?

dgenwo3n  于 2021-06-30  发布在  Java
关注(0)|答案(3)|浏览(348)

这个问题在这里已经有答案了

什么是“2的补码”(23个答案)
两年前关门了。
我在java中测试按位not运算符。我用二进制打印了~1的结果,结果返回“11111111111111111111111111111111111111111110”,其值显然是-2。
我知道你必须加1才能得到-1,最左边的一位只显示这个数是正还是负,但我不明白的是,为什么一个二进制数那么大,有那么多的1,计算结果只有-2。

uxhixvfz

uxhixvfz1#

是二的补码。如果要将数字转换为tc(以2为例):
把它写成二进制(假设它只有8位表示一个较短的表示)

00000010

对所有位求反

11111101

添加1

11111110

这就是为什么2看起来像那样。

ki1q1bka

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 所以,负的 0xFFFFFFFF0x00000001 ,通常称为 1 . 所以呢 0xFFFFFFFF-1 .
上面说明了为什么2的补码中的负数是 0xFFFFFFFF1 这就意味着 0xFFFFFFFF 手段 -1 . 以同样的方式你的价值 0xFFFFFFFE 有否定的 2 所以它本身 0xFFFFFFFE 手段 -2 二的补码。

cetgtptt

cetgtptt3#

另一种思考方法是,在32位有符号整数中,最左边的数字表示两个数字中的一个:

0000000000000000000000000000000 represents 0
1000000000000000000000000000000 represents -2147483648

根据定义。其他一切都是对这一点的补充,因此:

BINARY REPRESENTATION                      INT REPRESENTATION
1000000000000000000000000000000 plus       -2147483648 plus
0111111111111111111111111111110 equals      2147483646 equals
1111111111111111111111111111110                     -2

将最左边的(前导)位视为定义从何处开始计数是很有帮助的:
如果最左边的位是0,则从0开始计数
如果最左边的位是1,则从-2147483648开始计数
它右边的其余31位通过组成一个数字(最多为2147483647)来定义整数值本身 111 1111 1111 1111 1111 1111 1111 )这是加在起点上的。
有效地说,有符号整数环绕。它们的最大值约为20亿,然后立即翻到-20亿,再数到0: 0111111111111111111111111111111 是2147483647。如果再加上一个,你会得到: 1000000000000000000000000000000 它要么是2147483648,作为一个无符号整数,要么是-2147483648,根据定义是这样的。当您不断添加到任何整数时,它会接近: 1111111111111111111111111111111 有符号整数为-1,无符号整数为4294967295
最后,您应该理解并理解,如果您不断地向有符号整数相加,它们会自动环绕,但它们会立即从最大正值跳到中间的最小负值:

0, 1, ... 2147483646, 2147483647, -2147483648, -2147483647, ... -2, -1

这就是为什么您的'1111111111111111111111111111111 0'是-2,因为它比最大二进制表示法(在有符号整数空间中表示-1)小1

相关问题