我试图理解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
让我们从总结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,依此类推)。
来源
由于这个答案给了我几个点,我决定给它添加更多的信息。
在其他方法中,有四种主要的方法来表示二进制中的正数和负数,即:
使用最高有效位表示符号,其余位表示绝对值。其中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位硬件上: