2.3.4 整数在内存中的存储形式
计算机中,内存储器的最小存储单位称为“位(bit)”。由于只能存放0或1,因此称为二进制位。大多数计算机把8个二进制位组成一个“字节(byte)”,并给每个字节分配一个地址。若干字节组成一个“字(word)”,用一个“字”来存放一条机器指令或一个数据。一个字含多少个字节随机器的不同而不同。如果一台计算机以两个字节(16个二进制位)来存放一条机器指令,则称此计算机的字长为16位;如果以四个字节(32个二进制位)来存放一条机器指令,则称此计算机的字长为32位。
通常把一个字节中的最右边一位称为最低位,最左边一位称为最高位。对于一个有符号整数,其中最高位(最左边的一位)用来存放整数的符号,称为符号位。若是正整数,最高位放置0;若是负整数,最高位放置1。
一、正整数
当用两个字节存放一个short类型正整数时,例如正整数5,其在内存中的二进制码为:
0000000000000101
对于正整数的这种存储形式称为用“原码”形式存放。因此用两个字节存放short类型的最大正整数是:
0111111111111111
它的值为32767。为简单起见,若一个字节能够正确表示一个整数时,本书则用一个字节表示。
二、负整数
1.负整数在内存中是以“补码”形式存放的。
取某个二进制数的补码,例如10000101(十进制数-5)的补码,步骤如下:
(1)求原码的反码。把原码除符号位之外的二进制码按位取反,即把1变成0,0变成1,即得到该原码的反码。例如10000101的反码为111110100。
(2)把所得的反码加1,即得到原码的补码。因此11111010加1得11111011,这就是-5在内存中的二进制码。若用两个字节表示,即为:
1111111111111011
2.把内存中以补码形式存放的二进制码转化成十进制的负整数,步骤如下:
(1)先对除符号位之外的各位取反。例如有补码11111010,取反后为10000101。
(2)将所得二进制数转换成十进制数。例如,10000101的十进制数为-5。
(3)对所求得的数再减1,即为-6。
通过以上分析可知,由两个字节存放的最小整数是1000000000000000,它对应的十进制数为-32768,而-1在内存中存放的二进制码为1111111111111111。
三、无符号整数
用两个字节存放一个整数时,若说明为无符号整数,则最高位不再用来存放整数的符号,16个二进制位全部用来存放整数,因此无符号整数不可能是负数。这时,若内存中存放的16个二进制位全部为1,则它所代表的整数就不再是-1,而是65535。