第五节 整数存储
基础知识
计算机中整数数值的存储并不是简单的将其转为二进制存入内存,因为涉及到正负数、减法运算等问题,所以科学家们设计了一套整数的存储规则–三码。
原码
整数存储的时候,用最高位表示符号(0为正数,1为负数),后面几位存储二进制数值,如:
正数 | 二进制 | 负数 | 二进制 |
---|---|---|---|
0 | 0000 | -0 | 1000 |
1 | 0001 | -1 | 1001 |
2 | 0010 | -2 | 1010 |
我们会发现一个问题,我们计算-1+1的结果时,得到的是1001+0001=1010,结果是-2。所以就有了反码。
反码
负数的二进制使用反码:符号位不变,其他相反。
正数 | 二进制 | 负数 | 二进制 |
---|---|---|---|
0 | 0000 | -0 | 1111 |
1 | 0001 | -1 | 1110 |
2 | 0010 | -2 | 1101 |
现在-1+1的结果是0001+1110=1111,等于-0。但是,0通常被认为是不具有正负之分的,所以又有了补码。
补码
负数的补码是用反码+1。
正数 | 二进制 | 负数 | 二进制 |
---|---|---|---|
0 | 0000 | -0 | 0000 |
1 | 0001 | -1 | 1111 |
2 | 0010 | -2 | 1110 |
现在我们的加法运算就完美了,0也没有分正负。
总结
- 正数的原码、反码、补码都死它本身。
- 负数的反码为原码(除符号位)取反,补码为反码加一。
- 计算机内存中存储的是补码。
- 因为存储的是补码,所以存储范围中的负数总比正数多一个(-0的原码被用来表示最小的负数)。
赛题训练
- 在8为二进制补码中,10101011表示的数是十进制下的( )。
A.43 B.-85 C.-43 D.-84 - 在字长为16位的系统环境下,一个16位带符号整数的二进制补码位1111111111101101。其对应的十进制整数应该是( )。
A.19 B.-19 C.18 D.-18