在汇编的学习中,一开始就介绍了原码、反码和补码的关系;计算机只能识别01001这样的机器码,而汇编本质上来说是一种助记符,能够将人能读懂的助记符转化为机器才明白的机器码。而机器读取二进制是最高效的。
一、什么是原码、反码和补码
-
原码
原码是带符号位的二进制数,符号位即二进制数的最高位,用0表示该二进制数为正数,用1表示该二进制数为负数,符号位不参与二进制数转化结果的计算中。例如+13的八位原码为00001101
,而-13位的八位原码为10001101
。 -
反码
对于正二进制数来说,反码就是原码本身;对于负二进制数来说,反码就是除了符号位之外的数取反,例如-13的原码是00001101
,那么它的反码就是它的原码本身00001101
;-13的原码为10001101
,它的反码就是11110010
;。 -
补码
对于正二进制数来说,补码就是原码本身;对于负二进制数来说,补码就是补码最低位+1
,例如-13的补码是11110011
,+13的补码和反码、原码都一致。
二、基本类型所占空间推算
看完了原码、反码和补码,现在来看看Java语言中的基本类型及其所占的空间:
类型 | 占用字节数 | 占用位数 | 空间大小 |
---|---|---|---|
byte | 1 | 8 | -2^7 ~ 2^7 -1 |
char | 2 | 16 | -2^15 ~ 2^15 -1 |
short | 2 | 16 | -2^15 ~ 2^15 -1 |
int | 4 | 32 | -2^31 ~ 2^31 -1 |
float | 4 | 32 | -2^31 ~ 2^31 -1 |
double | 8 | 64 | -2^63 ~ 2^63 -1 |
long | 8 | 64 | -2^63 ~ 2^63 -1 |
在计算机中,每一个数据都占用一定的空间,它们所占的空间用“位(bit)
”来表示,例如一个byte类型,它占用1个字节数,即1*8=8bit,占8位空间,用图形来表示就是下图,其中最高位为符号位。
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
---|
那么,将二进制数11111111
转化为十进制数:
这里用到了等比数列的求和公式:
得:
S1 = -(2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0) = 2^7=-128
算上0占的位置,有
S2 = 2^6 + 2^5 + 2^4 + 2^3 + 2^2 + 2^1 + 2^0 - 1 = 127
所以求得一个byte类型数据范围为
-128~127
其余的各个基本类型所占的数据都可以通过这样算出来了~