补码与模

一、本篇来由

昨天进行了反码、补码那些和浮点数的研究,但是还有一些问题遗漏,晚上跟寝室众基友讨论了,反而提出来一个很有意思的问题,于是有了本篇~~我们并不知道为什么有补码这个东西,只知道在计算机中广泛用补码存储,不知道为什么叫“补”码。

二、模

“模”是指一个计量系统的计数范围。如时钟等。计算机也可以看成一个计量机器,它也有一个计量范 围,即都存在一个“模”。

例如:

时钟的计量范围是0~11,模=12。

表示n位的计算机计量范围是0~2(n)-1,模=2(n)。【注:n表示指数】

“模”实质上是计量器产生“溢出”的量,它的值在计量器上表示不出来,计量器上只能表示出模的

余数。任何有模的计量器,均可化减法为加法运算。

例如: 假设当前时针指向10点,而准确时间是6点,调整时间可有以下两种拨法:

一种是倒拨4小时,即:10-4=6

另一种是顺拨8小时:10+8=12+6=6

在以12模的系统中,加8和减4效果是一样的,因此凡是减4运算,都可以用加8来代替。

对“模”而言,8和4互为补数。实际上以12模的系统中,11和1,10和2,9和3,7和5,6和6都有这个特性。共同的特点是两者相加等于模。

这样就很清晰了,甚至这里的“模”跟我们学习除法的模和计算机中的mod都扯上了关系~~

三、补码原理

刚刚提到了模的概念,现在看看计算机补码和模的关系。

对于计算机,其概念和方法完全一样。n位计算机,设n=8, 所能表示的最大数是11111111,若再

加1称为100000000(9位),但因只有8位,最高位1自然丢失。又回了00000000,所以8位二进制系统的

模为2(8)。 在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以

了。

把补数用到计算机对数的处理上,就是补码。

另外两个概念

一的补码(one’s complement) 指的是正数=原码,负数=反码。

而二的补码(two’s complement) 指的就是通常所指的补码。

附:补码的代数解释

任何一个数a都可以被表示为:

-a=2^(n-1)-2^(n-1)-a;

假设a为正数,那么-a就是负数。而根据二进制转十进制数的方法,我们可以把a表示为:

a = k0*2^0 + k1*2^1 + k2*2^2 +……+ k(n-2)*2^(n-2)

这里k0,k1,k2,k(n-2)是1或者0,而且这里设a的二进制位数为n位,即其模为2^(n-1),而2^(n-1)其二项展开是:

1+2^0+2^1+2^2+……+2^(n-2)

,而将式子-a=2^(n-1)-2^(n-1)-a中的,2^(n-1)-a代入

a=k0*2^0+k1*2^1+k2*2^2+……+k(n-2)*2^(n-2)

2^(n-1)=1+2^0+2^1+2^2+……+2^(n-2)

,得到了

2^(n-1)-a = (1- k(n-2))*2^(n-2) + (1- k(n-3))*2^(n-3) +……+ (1- k2)*2^2 + (1- k1)*2^1 + (1- k0)*2^0 +1

这步转化正说明了取反再加1的规则的代数原理所在。

原理:

因为这里k0,k1,k2,k3……不是0就是1,所以1-k0,1-k1,1-k2的运算就是二进制下的取反,而为什么要加1,追溯起来就是2^(n-1)的二项展开式最后还有一项1的缘故。而-a=2^(n-1)-2^(n-1)-a中,还有-2^(n-1)这项未解释,这项就是补码里首位的1,首位1在转化为十进制时要乘上2^(n-1),这正是n位二进制的模。

四、补码与模

绕了这么一圈,终于回来了,万变不离其宗,总要有一个汇聚的时候。看看补码与模到底有什么关系

我们再来看一下刚刚推导公式:

2^(n-1)-a = (1- k(n-2))*2^(n-2) + (1- k(n-3))*2^(n-3) +……+ (1- k2)*2^2 + (1- k1)*2^1 + (1- k0)*2^0 +1

其实意思都在里面了,

总结:

(1)左边的2^(n-1)就是二进制的“模”,如:8位二进制数,模为2^7=128

(2)左边的 a 是一个数的源码

(3)右边所有的就是 a 的补码(取反+1)

这里说明了:一个数(负数)的

模 = 原码 + 补码

例:

a[原] = -16D = -001 0000B = 1001 0000[计]

a[反] = 1110 1111

a[补] = 1111 0000

反过来看,去掉符号位

模 = a[原] + a[补],即:128D = 001 0000 + 111 0000

因为对于一个数,计算机中补码是唯一的,所以可以用补码表示一个数

而且这里还有一个问题,就是可以用-0来表示-128,因为-0和-128互为补码

—–END—–

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-10 21:25:35

补码与模的相关文章

Java Integer 进制转化的实现(附源码),对模与补码的理解

1.toBinaryString方法的实现 1 public static String toBinaryString(int i) { 2 return toUnsignedString0(i, 1); 3 } 4 private static String toUnsignedString0(int val, int shift) { 5 // assert shift > 0 && shift <=5 : "Illegal shift value";

原码,反码,补码杂谈

本文从原码讲起.通过简述原码,反码和补码存在的作用,加深对补码的认识.力争让你对补码的概念不再局限于:负数的补码等于反码加一. 接触过计算机或电子信息相关课程的同学,应该都或多或少看过补码这哥仨.每次都是在课本的最前几页,来上这么一段:什么反码是原码除符号位,按位取反.补码等于反码加一.然后给整得莫名其妙,稀里糊涂地,接着就是翻页,反正后面的内容也跟三码没多大关系. 我原来也是看了好几遍都没看懂.古人云:事不过三.学C语言的时候,看过一次.不懂?看<计算机基本组成原理>的时候看过,还是不懂!到

为什么要使用原码、反码、补码和移码

上篇博客简单的介绍了计算机中原码.反码.补码和移码的表示方式(http://blog.csdn.net/xdd19910505/article/details/40424533),对于计算机为什么要这样还不是很明白,就好像知道这样一个东西,却不知道为什么要这样.就好像一个人你不了解他不是他的朋友,他的有些事情你就不知道他是为了什么-- 其实从原码到补码是一个层层递进的关系,也是一个在错误中逐步发展的过程.也就是说利用原码运算减法时出现的错误,为了解决出现了反码运算,但是反码运算时又出现了让人不满

补码一位乘法(Booth算法,C语言实现)

补码一位乘法 首先了解下什么是补码? 补码概念的理解,需要先从“模”的概念开始. 我们可以把模理解为一个容器的容量.当超出这个 容量时,会自动溢出.如:我们最常见到的时钟,其容量 是 12,过了 12 点之后,就会变为 1 点, 2 点……也就是 说,超过12的部分将被丢弃.那么,在这个例子当中,时钟 的模就是12.模的概念可以帮助我们理解补码的含义. 补码的引出:假设现在时钟的时针指向 4 点的位 置,要使其指向 3 点,可以怎么操作呢?很明显,共有 2 种方法,顺时针拨 11 格(+11),

java 自学篇之表达式语句运算

第三章 表达式语句运算 从这里我们就要进入程序里面的语句了,无论是C C++还是java,它们都是有表达式语句运算等组成. 表达式:由操作数与运算符所组成:操作数可以是常量.变量也可以是方法,而运算符就是数学中的运算符号,如"+"."-"."*"."/"."%"等. 一个表达式引出这么多东西,下面我们来一一看看这是什么东西. 操作数:常量.变量或者方法(方法怎么用?) 常用运算符 运算符:数学中的运算符号,

1.2 数据的表示

1. 计算机中的数 计算机中的数可分为两类:一类是数值性的数,另一类是非数值性的数.数值性的数主要用于计算.非数值性的数主要用于信息处理.数值性的数表示的是事物的数值或数量,非数值性的数表示的是事物的名称.属性.存在位置.形体特征等. 数值性的数有正数和负数,为了在计算机中区分正.负,人们用 0 代表正,用 1 代表负. 数除了有正.负之外,还有整数.小数之分.在计算机中为表示这些数规定了两种形式的数:一种是定点数,另一种是浮点数.其中,定点数又分为定点小数和定点整数.在计算机中不论表示定点数还

1-计算机中的数据信息表示

二.八.十六进制转换 对于任何一个R进制的数有:(N)R=∑n−1i=−mxiRi=xn−1Rn−1+xn−2Rn−2+...+x0R0+x−1R−1+...+x−(m−1)R−(m−1)+x−mR−m 其中R是R进制数的基数x取值范围是R-1 并且规则是逢R进1 数值转换时需要注意的问题: 不同进制数的基数不同 所使用的数字取值范围也不同 将任意进制数转换为十进制的方法是按权相加 即利用按权展开多项式系数x 与位权值相乘后 将乘积逐项求和 将十进制数转换为任意进制数时 整数部分与小数部分需要分

CSAPP(1):数字的计算机表示

在计算机中,使用位来存储信息.相同的位级表示,改变其解释方式,则表达出不同的信息. 0.位级运算中的异或 位级运算中需要注意的是异或这个运算,x^y异或的含义是:对于第i位,x,y在i位上的值不同时,结果为1:这意味着,在第i位上,x,y有且仅有一个1时,结果为1:有且仅有一个0时,结果为1:两者的值相同时,结果为0:异或的变化及其灵活:x^y = x|y – x&y; x^y = x&~y | ~x&y; (别的变化再补充). 一.无符号整数及编码 位向量x=[xw-1,...,

基础之——原码、反码、补码 详解

本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1.机器数 一个数在计算机中的二进制表示形式,  叫做这个数的机器数.机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计