当前位置: 首页 > 知识库问答 >
问题:

在Java中,整数是如何以位级别在内部表示的?

端木乐语
2023-03-14

我试图理解Java是如何在内部存储integer的。我知道所有java原语整数都是带符号的,(除了short?)。这意味着该数字在一个字节中少了一个可用位。

我的问题是,是所有的整数(正负)都存储为二的补码还是只有负数在二的补码中?

我看到规格上写着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`

因此,如果您的答案是所有数字存储为2的补码,那么:

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

共有1个答案

澹台承
2023-03-14

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

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

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

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

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

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

来源

二的补码

“wiki中的一个很好的例子是,通过注意256=255+1,以及(255−x)是x的1的补码来实现与2的补码的关系。”

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

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

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

来源

由于这个答案给了我几个点,我决定给它添加更多的信息。

在其他方法中,有四种主要的方法来表示二进制中的正数和负数,即:

    null

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

1011 = -3
0011 = +3

这种表示方式更简单。但是,您不能以添加十进制数字的方式添加二进制数字,这使得它更难在硬件级别实现。此外,该方法使用两个二进制模式来表示0,-0(1000)和+0(0000)。

2.一个人的补充

010 = 2, so -2 = 101 (inverting all bits).

这种表示的问题是仍然存在两个位模式来表示0,负0(1000)和正0(0000)

3.二的补码

为了求一个数的负数,在这个表示法中,我们将所有的位反转,然后再加上一位。添加一个位解决了有两个位模式表示0的问题。在这个表示中,我们只有0(0000)的一个模式。

例如,我们想用4位来求4(十进制)的二进制负表示。首先,我们将4转换为二进制:

4 = 0100

然后我们将所有的位反转

0100 -> 1011

最后,我们添加一个位

1011 + 1 = 1100.

所以1100在十进制中相当于-4,如果我们使用的是4位的二进制补码表示法。

求互补的一种更快的方法是将第一个位固定为值1,并将其余位反相。在上面的示例中,它将类似于:

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

two的补码表示法,除了0只有一种表示法外,它还以小数中相同的方式,将两个二进制值相加,带不同符号的偶数。尽管如此,还是有必要检查溢出情况。

4.偏见

此表示用于表示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如何在内部存储整数。我知道所有Java基本整数都是带符号的(短符号除外)。这意味着该数字在一个字节中减少了一位。 我的问题是,是否所有整数(正数和负数)都存储为二进制补码,或者仅是负数在二进制补码中? 我看到规格说明了。但是我经常感到困惑。 例如: 编辑 要清楚一点 因此,如果你的答案是 数字存储为二进制补码,则: 这里的混乱再次是符号说的,它们都是负数。可能是我误读

  • 问题内容: 我们都知道数学上的区间(例如-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

  • 问题内容: 如何在PHP中使用64位整数? 似乎它不是由配置文件提供的,而是可能是一个编译时选项,并且取决于平台。 问题答案: 本机64位整数需要64位硬件和64位版本的PHP。 在32位硬件上: 在64位硬件上: