这一小节中,我们要学习原码、反码、补码3 种码的特性对比,需要注意这样的几个维度。
一会我们会来分别探讨,这是小题当中很常见的考点哈。
这个小节的内容不难,也不多,我们只需要注意表里边给大家总结的问题就可以了。
经过之前的学习,我们知道了带符号的整数,可以用原、反、补三种方式来表示。
无符号的整数把所有的比特位都作为数值位,无符号的整数它只有一种编码方式,所以我们没给它取什么什么码这样的名字。
接下来我们来看一下对于 n + 1
个比特表示的原码、反码、补码以及无符号整数,它们的合法表示范围、最大的数、最小的数以及真值 0 的表示分别是什么样的情况。
(1)原码
首先,之前我们讨论过原码的表示范围。如果用 n + 1 个比特表示原码,原码的数值位就有用 n 个比特来表示,n 个比特可以表示的数的范围应该是 0~ 2 的 n 次方减1。再加上1个比特的符号位,可以表示正号或者负号。
因此原码它的一个合法表示范围是这样的范围,它可以表示的最大的数应该是正数0,后面所有的都是 1 ,转变成十进制的值应该是 2 的 n 次方减1。
最小的数就是负的1,数值位让它保证值是最大的,也就是全为1。这样我们就可以表示最小的数,负的 2n 次方减1。
之前我们也说过,原码的真值 0 有两种表现方式,一种是正0,一种是负0。
(2)反码
反码和原码是一毛一样的。
首先,反码和原码,它们的合法表示范围都一样。
反码它也有正0和负0这两种真值 0 的表示形式,反码可以表示的最大的数和最小的数,真值和原码也是一致的,所以反码其实不用多说。
(3)补码
这儿我们需要特别注意的是补码。
补码可以表示的合法范围要比原码更多一个负数。
如果用 8 个比特来表示原反补码的话,原码和反码可以表示的范围应该是-127 到+127,而补码可以表示的范围应该是-128 到+127。
补码可以比原码多表示一个负数。最小的负数的补码形式长1,000...000
这个样子,就是符号位为1,后面的全部为0。
如果是8比特的补码,可以表示的最小的数应该是10000000,这是8比特可以表示的最小的数,它的真值是-128 。
8比特的原码可以表示的最小的数应该是1,1111111
这样的一个值,也就是-127 。
所以我们上一小节讲过原码和补码之间的相互转换。由于补码可以比原码多表示一个负数,所以补码当中更小的负数,想要把它转变为位数相同的原码是不可能的,转不了,因为用相同的位数原码没办法表示-128 这个数。
所以这是补码最特殊的一个存在,它可以比原码多表示一个负数。
同时在补码当中,真值 0 也只有唯一的一种表示方式,符号位为0,后面的这些也全部为0。
所以这一点是一定要注意的。
(4)无符号整数
最后看无符号整数。
这些特性我们在讲无符号整数的小结当中,也给大家总结过。 n + 1 个比特表示无符号整数,那么它的合法表示范围可以表示的最大的数,最小的数,还有真值 0 的表示方法,这些大家也都需要很熟悉。
重点要强调的还是补码它的表示范围以及真值 0 的表示方法和原码反码之间的一点区别。
大家特别注意标红的这些地方就可以了。
最后再说一个在很多小题和大题当中都挺常见的一种考法。
题目会给你两个数 A 和B。一般来说就是用二进制或者 十六进制来表示。他会问你这两个数进行某种运算之后,比如加减乘除这些运算之后,问你是否会发生溢出。
这种题目怎么解决?
如果手算,你判断溢出的方法可以带入十进制去验证。
我们来看。 以8比特为例,如果用8比特表示 A 和B,如果这8比特是用原码的方式来表示, 那么A 的值是原码表示的-64, B 的值是原码表示的-64。
题目如果问你 A 和 B 进行加法之后,结果同样用8比特的原码表示,是否会发生溢出。
显然会发生溢出,-64和-64,两个一相加应该是等于-128。
而8比特的原码可以表示的范围就是-127到+127,显然这个值已经超出了8比特原码可以表示的范围,所以此时一定会发生溢出。
如果换一个情况,如果这8比特是用补码表示的,同样 A 是-64, B 也是-64,问你 A 加 B 的结果,同样用8比特的补码来保存有没有发生溢出呢?
此时就没有发生溢出,我们说了,补码它可以多表示一个负数,8比特的补码可以表示的合法范围应该是-128 到+127,所以 A 加 B 的值刚好没有超出8比特补码可以表示的范围。
因此如果是用补码来保存结果,此时加法运算就没有发生溢出。
以上就是小节的全部内容。