0
点赞
收藏
分享

微信扫一扫

【计算机组成原理】定点数(整数)的表示——补码

小北的爹 2022-02-06 阅读 70
开发语言

目录

1、模运算系统

1.1什么是模运算?

“模”是“Mod”的音译,模运算多应用于程序编写中。 Mod的含义为求余。模运算在数论和程序设计中都有着广泛的应用,从奇偶数的判别到素数的判别,从模幂运算到最大公约数的求法,从孙子问题到凯撒密码问题,无不充斥着模运算的身影。虽然很多数论教材上对模运算都有一定的介绍,但多数都是以纯理论为主,对于模运算在程序设计中的应用涉及不多。来自【百度百科】

1.2重要概念

在一个模运算系统中,一个数与它除以“模”后的余数等价。
如何理解呢?举一个非常经典的模运算系统——时钟
理解什么是取模运算(取余)
时钟是一个模12的系统,时针每天最大值不过12,最小值不过1;怎么理解这个模系统呢,
假定一个时钟从1点(x)开始计时,经过了12(y)个小时,他的值(z)是多少呢,应该是z=13对不对,但是由于我们时钟是一个模12系统,实际上z=1,怎么计算的呢?
z=(x+y)%12=1;这个%指的是取余操作,也就是取模运算。

再来看它的用法,比如说,现在时钟指向10点整,我要把时针拨到6点该怎么办呢,我们可以顺时针拨动,也可以逆时针拨动对吧,两种方法怎么计算呢
顺时针:(10+x)%12=6,x=8,也就是顺拨8格
逆时针:(10+x)%12=6,x=-4,也就是逆拨4格。
这里的8其实就是在这个模12系统中-4的一个补码,它的效果和-4一样,所以它能避免了一个数字以负数的形式出现
我们其实可以从中得出一些结论:

——有点绕,跟着来其实很好理解的,括号里就是例子

2、加法器

怎么通过加法器来来做减法呢,其实加法器是一种模运算系统 ,也就是说我们可以将需要减去的一个数看做是一个负数,然后我们对它的补码进行加法运算就好了
比如 计算0111 1111 - 0100 0000 = ?
根据上面提到的方法,我们需要 - 0100 0000它的补码,它的模是多少呢,看位数,mod=2^n;这里是八位,也就是说mod=2^8,从上面的结论1我们可以知道,一个负数的补码等于模减该负数的绝对值,也就是2^8-0100 0000=1100 0000
由此我们其实可以发现这个负数的补码等于对应正数补码——各位取反、末位加1不是幻觉这就是一个结论,哈哈
原式也就是等于0111 1111 + 1100 0000= 1 0011 1111 (mod 28)(这里只留余数,即后八位)=0011 1111。有兄弟可能会问,为啥只能要后八位呢,计算机中运算器只有有限位。假定为n位,则运算结果只能保留低n位,故可看成是个只有n档的二进制算盘。所以,其模为2n 。

3、补码公式

**补码的定义 假定补码有n位,则:

为啥没有定点小数的补码公式呢,别找了,虽然有,但是计算机不用这玩意表示小数呀,别找了!
有兄弟要心算二进制补码怎么办?方法来啰!

比如:[01111011]补=01111011

比如: [-01111011]补=10000101

4、定点数的补码表示原因

咱说了大半天,一直叨叨补码,那为啥一定要搞个补码来表示整数呢

咳咳,新的问题又来了,啥是无符号整数(unsigned)啊啥是有符号整数(signed)啊

通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制转换为无符号数,并假设这两个数都是非负的,来执行这个运算。

附带一手表示范围吧
在这里插入图片描述

举报

相关推荐

0 条评论