让我们从总结 Java 基元数据类型开始:
byte:Byte 数据类型是 8 位有符号二进制的补码整数。
Short:Short 数据类型是 16 位有符号的 2 的补码整数。
整型:Int 数据类型是 32 位有符号二进制的补码整数。
长:长整型数据类型是 64 位有符号二进制的补码整数。
浮:浮点数据类型是单精度 32 位 IEEE 754 浮点。
double:double 数据类型是双精度 64 位 IEEE 754 浮点。
布尔值:布尔数据类型表示一位信息。
char:char 数据类型是单个 16 位 Unicode 字符。
源
二的补体
“一个很好的例子来自wiki,通过指出256 = 255 + 1和(255 − x)是x的补码来实现与二进制补码的关系。
0000 0111=7 二的补码是 1111 1001= -7
它的工作方式是MSB(最高有效位)接收负值,因此在上面的情况下
-7 = 1001= -8 + 0+ 0+ 1
正整数通常存储为简单的二进制数(1 表示 1,10 表示 2,11 表示 3,依此类推)。
负整数存储为两者对其绝对值的补码。当使用此表示法时,两者的正数补码是负数。
源
由于我收到了这个答案的几分,我决定添加更多信息。
更详细的答案:
其中有四种主要方法可以表示二进制的正数和负数,即:
- 有符号量级
- 一个人的补体
- 二的补体
- 偏见
1. 有符号量级
使用最高有效位来表示符号,其余位用于表示绝对值。其中 0 表示正数,1 表示负数,例如:
1011 = -3
0011 = +3
这种表示形式更简单。但是,不能以添加十进制数相同的方式添加二进制数,从而更难在硬件级别实现。此外,此方法使用两种二进制模式来表示 0、-0 (1000) 和 +0 (0000)。
2. 一个人的补体
在这种表示中,我们反转给定数字的所有位以找出其互补性。例如:
010 = 2, so -2 = 101 (inverting all bits).
这种表示的问题在于,仍然存在两个位模式来表示0,负0(1111)和正0(0000)
3. 二人补码
为了找到一个数字的负数,在这个表示中,我们反转所有位,然后添加一个位。添加一个位解决了具有两个表示 0 的位模式的问题。在此表示中,我们只有一个 0 (0000) 的模式。
例如,我们希望使用 4 位查找 4(十进制)的二进制负表示。首先,我们将 4 转换为二进制:
4 = 0100
然后我们反转所有位
0100 -> 1011
最后,我们添加一位
1011 + 1 = 1100.
因此,如果我们使用4位的Two的补码二进制表示,则1100相当于十进制中的-4。
找到互补的更快方法是将第一个位固定为值1并反转其余位。在上面的示例中,它将是这样的:
0100 -> 1100
^^
||-(fixing this value)
|--(inverting this one)
二的补码表示法,除了只有一个表示 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