首先,让我们总结一下Java原始数据类型:
byte:字节数据类型是8位有符号二进制补码整数。
short:短整型数据类型是16位有符号二进制补码整数。
int:整型数据类型是32位有符号二进制补码整数。
long:长整型数据类型是64位有符号二进制补码整数。
float:浮点型数据类型是单精度的32位IEEE 754浮点数。
double:双精度数据类型是双精度的64位IEEE 754浮点数。
boolean:布尔数据类型表示一位信息。
char:字符数据类型是一个16位Unicode字符。
来源
二进制补码
"好的例子来自于维基百科,它通过注意到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:负零(1000)和正零(0000)。
2. 反码
在这种表示法中,我们翻转给定数字的所有位以找出其补码。例如:
010 = 2, so -2 = 101 (inverting all bits).
这种表示法的问题在于,仍然存在两种比特模式来表示0,负零(1111)和正零(0000)。
3. 补码
在此表示法中,要找到一个数的负数,我们需要反转所有比特位,然后再加上一位。加上一位解决了具有两种比特模式表示0的问题。在这种表示法中,只有一个模式表示0 (0000)。
例如,我们想使用4个比特位找到4(十进制)的二进制负数表示。首先,将4转换为二进制:
4 = 0100
然后我们取反所有位
0100 -> 1011
最后,我们添加了一位(bit)。
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
char
是唯一的无符号整数值。 - undefined