【NOIP初赛篇3】基础知识(二)原码、反码和补码
一、位和字节(bit && Byte)
我们都知道计算机上所有的数据和运算都是基于二进制进行的,那么讲到数据的存储的时候,我们总是会涉及到数据的大小的问题,那么我们都是如何描述数据的大小的呢?目前我们最常见的单位是TB,GB,MB,KB等。譬如说一块硬盘的存储空间大小是1TB,一条内存的大小是4GB,一个文件的大小是8MB等等。这些单位都是描述数据大小的,并且他们可以相互转化。
1 PB = 1024 TB (1024 = 2^10)
1 TB = 1024 GB
1 GB = 1024 MB
1 MB = 1024 KB
1 KB = 1024 B
以上就是我们最常用的一些单位了,似乎1B 已经是最小的表示单位了。等一下,1B真是的是最小的单位了吗?
答案当然是否定的。其实在1B之下,还有更小的单位,1B的全称是1Byte(1个字节),一个字节,是由八位的二进制数构成的。一位二进制,我们称为比特(bit),这才是计算机里的最小单位,1bit,只能表示0或1,再也找不到比这个更小的单位了。由上面的关系,我们可以得出
1 B = 8 bit
如果我们再稍加深入研究一下,1B,是由8位二进制数表示,那么它的范围我们是可以求的。那么它的范围是多少呢?
1 B = 8 bit稍加思索,我们可以得到,最小值应该是八个都填0,即00000000,换成十进制是0;最大值应该是八个都填1,即11111111,换成十进制是255。因此1B的范围,其实是0~255,总共有256种可能,也就是2^8。稍加推理,如果有n位,即有2^n种可能。
二、原码
前面我们提到8位的二进制的范围是0~255,总共256种情况,但是计算机里面,很少这样表示。那么计算机是如何表示的呢?计算机考虑到正负数的情况,因此往往会将最高位(左边第一位)设置为符号位,如果是0表示是正,1表示是负。如果是8位,除去最高位表示符号,其实只剩下7位用来表示数字的范围,并且这7位表示的数字是该数的绝对值,我们也叫它真值。这样的表示方式,我们成为原码。
原码用前面的方式,我们可以得出,7位数的范围是0~127,结合符号位,那么8位的原码可以表示的范围是-127~+127,其中因为有了+0与-0,所以表示范围只有255种。原码的优缺点都很明显,优点是一目了然,缺点是是重复的0。其实还有一个缺点是计算不方便,譬如正负数相加时会比较复杂。
三、反码
反码很少用来表示数,它更多时候是充当连接原码与补码的桥梁。反码很好理解,同样的是最高位表示符号,剩下的位数表示数值。但是它与原码不同的是,正数的反码与原码一致,但是负数,除了符号位保持不变,依旧是1外,数值位,全部需要反转过来,1变0,0变1,因此我们称它反码。下面我们举例说明:
原码 00001010 表示的是+10,它的反码就是它本身,00001010
原码 10001010 表示的是 -10,它的反码是符号位不变,数值位反转,即 11110101
四、补码
其实在计算机中很少用原码表示,基本上都是用补码来表示和计算的,这是因为补码更有利于计算,补码可以直接带上符号进行计算。在原码和反码中,符号位是不能计算的,譬如正负数相加,需要比较它们的绝对值才能得出符号的正负,但是在补码中,符号位是可以直接计算的,最终的结果可以直接表示正负,因此补码比原码和反码更方面计算。有兴趣的同学可以继续探究,这里不展开。
不论是原码、反码、补码,它们的最高位都是符号位,剩下的位都是数值位,并且正数,原码、反码、补码都是一样的,即正数“三码合一”。比较复杂的是负数,负数的补码,是在它的补码的基础上,在末尾加1。下面我们距离说明。
原码、反码、补码从上面,我们也可以得出,不论是+0,还是-0,补码都是唯一,均为00000000,这也是为什么用补码,而不用原码计算的原因之一。
五、练习
1、【2009提高组(单选)】在字长为16位的系统环境下,一个16位带符号整数的二进制补码为1111111111101101。其对应的十进制整数应该是( )。
A.19 B.-19 C.18 D.-18
2、【2010普及】一个字长为8位的整数的补码是11111001,则它的原码是( )。
A.00000111 B.01111001 C.11111001 D.10000111
3、【2010提高组(多选)】在整数的补码表示法中,以下说法正确的是( )。
A.只有负整数的编码最高位为1
B.在编码的位数确定后,所能表示的最小整数和最大整数的绝对值相同
C.整数0只有一个唯一的编码
D.两个用补码表示的数相加时,如果在最高位产生进位,则表示运算溢出
练习
1、无符号二进制数11001000所表示的十进制数为___________。
A .104 B. 148 C. 172 D . 200
2、有符号二进制数11001000所表示的十进制数为___________。
A . -200 B. -72 C. 72 D . 200
3、用16位和8位机器码分别写出十进制数+58和-58的原码、反码和补码。
4、若用8位机器码表示十进制数-101,则原码表示的形式为( );
A.11100101 B.10011011 C.11010101 D.11100111
补码表示的形式为( )。
A.11100101 B.10011011 C.11010101 D.11100111
5、已知一个字长为8的整数的原码是10011010,求它的补码。
6、已知一个字长为8的整数的补码是10011000,求它的原码。
答案:
真题:1、B 2、 A 3、AC
练习: 1、D 2、B
3、(1)+58 16位原码:0000 0000 0011 1010 反码:0000 0000 0011 1010
补码:0000 0000 0011 1010
8位原码:0011 1010 反码:0011 1010 补码:0011 1010
(2)-58 16位原码:1000 0000 0011 1010 反码:1111 1111 1100 0101
补码:1111 1111 1100 0110
8位原码:1011 1010 反码:1100 0101 补码:1100 0110
4、(1)A (2) B
5、1110 0110
6、1110 1000