5.1.5_原反补码的特性对比

简介: 计算机组成原理之原反补码的特性对比

这一小节中,我们要学习原码、反码、补码3 种码的特性对比,需要注意这样的几个维度。
image.png

一会我们会来分别探讨,这是小题当中很常见的考点哈。

这个小节的内容不难,也不多,我们只需要注意表里边给大家总结的问题就可以了。
image.png

经过之前的学习,我们知道了带符号的整数,可以用原、反、补三种方式来表示。

无符号的整数把所有的比特位都作为数值位,无符号的整数它只有一种编码方式,所以我们没给它取什么什么码这样的名字。

接下来我们来看一下对于 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。
image.png

补码可以比原码多表示一个负数。最小的负数的补码形式长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比特补码可以表示的范围。

因此如果是用补码来保存结果,此时加法运算就没有发生溢出。

以上就是小节的全部内容。

相关文章
|
11天前
|
存储 编译器
二进制相关概念、运算与应用
本文详细介绍了二进制、原码、反码和补码的概念及其应用,包括8位二进制的表示范围和常见位运算符的使用方法。通过具体示例,解释了位运算在数值翻倍、字符大小写转换和IP地址生成中的巧妙运用。此外,还提供了进制间转换的方法和Java-API中的支持。本文旨在帮助读者深入理解位运算的基础和实际应用。
28 1
二进制相关概念、运算与应用
反码与补码的概念及其在计算机中的应用
反码与补码的概念及其在计算机中的应用
|
5月前
|
存储 C语言
【C语言进阶篇】整数在内存的存储——原码、反码、补码
【C语言进阶篇】整数在内存的存储——原码、反码、补码
|
11月前
|
存储 C#
C# 逻辑位运符及运算原理 按位操作二进制
C# 逻辑位运符及运算原理 按位操作二进制
|
6月前
|
存储 编译器 C语言
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
【C语言】数据的存储(基本类型介绍、原码、反码、补码详解、大小端的理解、浮点数的存储规则)
86 0
|
6月前
|
存储 编译器 C语言
什么?整形家族在内存中存的不是原码而是补码???
什么?整形家族在内存中存的不是原码而是补码???
|
存储 IDE Java
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
二进制到汇编:进制,原码反码补码,位运算,通用寄存器,内存一套打通
172 1
数字逻辑基础:原码、反码、补码
数字逻辑基础:原码、反码、补码
179 0
进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系
进制之间的快速转换法:8421码及原码反码补码之间的相互转换关系
497 0
|
前端开发
前端学习案例1-二进制中的反码和补码1
前端学习案例1-二进制中的反码和补码1
68 0
前端学习案例1-二进制中的反码和补码1