当前位置: 首页 > 面试题库 >

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

漆雕疏珂
2023-03-14
问题内容

我试图了解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吗?

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


问题答案:

让我们从总结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


 类似资料:
  • 我试图理解Java是如何在内部存储integer的。我知道所有java原语整数都是带符号的,(除了short?)。这意味着该数字在一个字节中少了一个可用位。 我的问题是,是所有的整数(正负)都存储为二的补码还是只有负数在二的补码中? 我看到规格上写着。但我经常搞糊涂。 编辑 明确地说, 因此,如果您的答案是数字存储为2的补码,那么:

  • 问题内容: 我们都知道数学上的区间(例如-4 <x <3)。 如何用Java表示这些数学区间,例如-4和3之间的数字(-4,-3,…,2、3等)? 问题答案: 检查apache commons-lang 。因此,如果要检查数字是否在给定的间隔(范围)内,请执行以下操作:

  • 问题内容: Unicode字符串如何在Python的内存中按字面表示? 例如,我可以在内存中可视化为等效的ASCII字节。整数可以认为是2的恭维表示形式。但是,即使以3个字节长表示,我如何在内存中可视化原义代码点? 是否有将其存储在内存中的特定方法?Python 2和Python 3是否有区别? 问题答案: 我假设您想了解CPython(标准实现)。Python 2和Python 3.0-3.2对

  • 我试图弄清楚实际上是如何在内存级别上工作的。在linux手册页中: 我知道实现细节可能留给操作系统之类的东西。但我想知道,总的来说,这是如何实现的。

  • 问题内容: 我正在开发一个需要使用记录器功能的应用程序。我已经了解了不同级别的记录器,这些记录器是: 严重(最高) 警告 信息 配置 精细 罚款 最好的 我无法理解每个日志记录级别的用法。 有人可以给我一个很好的例子,显示所有日志记录级别及其用法吗? 问题答案: 通常,您不需要所有这些级别,SEVERE,WARNING,INFO,FINE可能就足够了。我们正在使用Log4J(不是直接java.ut

  • 我有一个很大的数组,它有很多元素,我需要在控制台中显示它,我使用console.log(),但只显示了一部分。 如何显示完整的内容?