在汇编的学习中,一开始就介绍了原码、反码和补码的关系;计算机只能识别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
其余的各个基本类型所占的数据都可以通过这样算出来了~
本文详细解析了原码、反码和补码的概念及其在计算机中的应用,同时介绍了Java基本类型所占空间及数值范围的计算方法。
9694

被折叠的 条评论
为什么被折叠?



