小编典典

在Java中如何在位级别上内部表示整数?

java

我试图了解Java如何在内部存储整数。我知道所有Java基本整数都是带符号的(短符号除外)。这意味着该数字在一个字节中减少了一位。

我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者仅是负数在二进制补码中?

我看到规格说明了x bit two's complement number。但是我经常感到困惑。

例如:

  int x = 15; // Stored as binary as is?  00000000 00000000 00000000 00001111?
  int y = -22; // Stored as two complemented value? 11111111 11111111 11111111 11101010

编辑

要清楚一点 x = 15

   In binary as is: `00000000 00000000 00000000 00001111'
  Two's complement: `11111111 11111111 11111111 11110001`

因此,如果你的答案是 all数字存储为二进制补码,则:

  int x = 15; // 11111111 11111111 11111111 11110001
  int y = -22 // 11111111 11111111 11111111 11101010

这里的混乱再次是符号说的,它们都是负数。可能是我误读/误解了吗?

编辑 不确定我的问题是否令人困惑。被迫隔离问题:

我的问题恰恰是:正数存储为binary as is,负数存储为two's complement吗?

有人说全部都存储在二进制补码中,一个回答说只有负数被存储为二进制补码。


阅读 428

收藏
2020-03-16

共1个答案

小编典典

让我们从总结Java基本数据类型开始:

byte:字节数据类型是8位带符号的二进制补码整数。

Short:短数据类型是一个16位带符号的二进制补码整数。

int: Int数据类型是32位带符号的二进制补码整数。

long: long数据类型是一个64位带符号的二进制补码整数。

float: float数据类型是单精度32位IEEE 754浮点。

double:double数据类型是一个双精度64位IEEE 754浮点数。

boolean:布尔数据类型表示信息的一位。

char: char数据类型是单个16位Unicode字符。

资源

补码

“一个很好的例子来自维基,它与二进制补码的关系是通过注意到256 = 255 + 1来实现的,并且(255-x)是x的二进制补码。

  • 0000 0111=7 two’s complement is 1111 1001= -7

它的工作方式是MSB(最高有效位)接收到负值,因此在上述情况下

-7 = 1001 = -8 + 0+ 0 + 1

正整数通常存储为简单的二进制数(1为1,10为2,11为3,依此类推)。

负整数作为其绝对值的二进制补码存储。当使用此符号时,正数的二进制补码为负数。

由于我对这个答案有几点建议,因此我决定向它添加更多信息。

更详细的答案:

除其他外,还有四种主要方法可以用二进制表示正数和负数,即:

  • Signed Magnitude
  • One’s Complement
  • Two’s Complement
  • Bias

1. Signed Magnitude

使用最高有效位表示符号,其余位用于表示绝对值。其中0代表一个正数,1代表一个负数,例如:

1011 = -3
0011 = +3

这种表示比较简单。但是,你不能以与添加十进制数相同的方式添加二进制数,这使得在硬件级别更难以实现。此外,此方法使用两个二进制模式来表示0、100 … 0和0 .... 0。

2. One’s Complement

在这种表示中,我们将给定数字的所有位求反,以找出其互补性。例如:

010 = 2, so -2 = 101 (inverting all bits).
这种表示的问题是仍然存在两个位模式来表示0(00..0和11..1)

3.Two’s Complement

为了找到数字的负数,在此表示形式中,我们将所有位取反,然后再加一位。加一位解决了两个位模式代表0的问题。在这种表示中,我们只有一个(00 … 0)。

例如,我们要使用4位找到二进制负表示形式4(十进制)。首先,我们将4转换为二进制:

4 = 0100

然后我们将所有位反转

0100 -> 1011

最后,我们加一点

1011 + 1 = 1100.

因此,如果我们使用具有4位的二进制补码二进制表示形式,则1100等于十进制的-4。

查找互补词的更快方法是将第一个位固定为值1,然后反转其余位。在上面的示例中,它将类似于:

0100 -> 1100
^^ 
||-(fixing this value)
|--(inverting this one)

二进制补码表示法,除了只有一个表示0的表示法外,还以与十进制相同的方式添加两个二进制值,即偶数具有不同的符号。但是,有必要检查溢出情况。

4.Bias

此表示用于表示浮点的IEEE 754规范中的指数。其优点是所有位均为零的二进制值代表最小值。所有位均为1的二进制值表示最大值。顾名思义,该值将以n位二进制值(通常为2 ^(n-1)或2 ^(n-1)-1)以二进制形式(正或负)进行编码。

因此,如果我们使用的是8位,则十进制的1值将以2 ^(n-1)的偏差用二进制表示,取值为:

+1 + bias = +1 + 2^(8-1) = 1 + 128 = 129
converting to binary
1000 0001
2020-03-16