原理:
一,提出:计算机的模运算系统
又称模算数 (modular arithmetic),是一个整数的算术系统,其中数字超过一定值后 (称为模)会“卷回”到较小的数值,在生活中特别常见的便是我们的钟表。
这里出现一个模的概念,究竟什么是模呢?
模 我把它定义为这个系统中所表示的数字的最多的个数,例如钟表的模是12 ,因为它只可以表示0-11这十二个数,再比如对于一个四位的二进制数,它的模是16,因为它只能表示16个数(如果考虑负数则是-8到7,不考虑负数是0到15)那么对于一个n位的二进制数,它的模是。
我们首先来看这样一个现象,当我们想将时针从四点拨到十一点,这时候我们有两种方法,一种是逆时针方向拨5,一种是顺时针方向拨7,因为两者相反,我们选定逆时针方向为正方向,则可以分别记作-5与+7,我们发现两者的达到的效果是一样的。
启发我们是否可以用一个正数来代替负数实现减法运算,(上例中用7代替-5)这便是计算机存储整形类数据的补码的生活源头,我们可以认为-5的补码为7。 通过这样的模运算,我们就可以把减法转换为加法。
计算机中减法的实现
就是通过减去一个数等效于加上这个数的相反数的补码的实现的
如我们要计算8-1等于多少?假设用四位存储
=8+(-1)
转换为二进制1000-0001=1000+0001的补码= 1000+1111=10111=0111(最高位要舍弃)
那么该怎么求一个数的补码呢?
二:补码的求法
那么我们可以怎样求一个数的补码呢,设该数为X,该运算系统中的模为M,我们通过上述不难发现
【X补码】=(M+X)%M (这里%为求余运算)
即一个数的补码=(模+这个数)除以模的余数
比如 -1的补码=(16+(-1))%16=15
1的补码=(16+1)%16=1
观察我们发现
正数的补码与原码相同
负数的补码是最高位符号位为1不变,其余位原码按位取反,然后整个数加1
例如: 存储器能够存储保留4位,则-7的补码为多少?
用上面的公式【-7补码】=(16+(-7))%16=9
实际上这个除模求余运算由计算机自动完成, 因为它会自动舍弃最高位(已经溢出),实现该运算,以上是它的原理,实际求补码只需要正数不变,负数各位取反再加1
弄明白以上原理之后,我们便可以求得C++中的一些数据类型的范围了