首页 > 代码库 > c 整数运算
c 整数运算
一、无符号加法(形式的模运算,无符号加法等价于计算模2w 的和)
示例:非负数 x 和 y
位数: w(8位机)
范围: 0 <= x,y <= 2w -1
结果:0 <= x+y <= (2w -1 + 2w -1) ====> 0 <= x+y <= 2w +1-2
比如:200 + 100 = 300 (2w -1 <= 300 <= 2w +1-2 ) ====> 300 mod 2w(256) = 44
过程:300转换成二进制:100101100,但是咱们是8位机,我们从右往左数,左边的是高位,右边的是低位,把去高位舍去,保留8位:00101100(转换成10进制就是44)
那么这里就会出现一个很重要的概念:溢出?拿上边的示例来说明:当x + y > 2w -1的时候,这个x+y的结果就会溢出,如图(整数加法和无符号加法之间的关系):
从这个图中我们可以分析一下,大概有两种情况(假设:w为4位 ):
a. x + y < 2w 它的结果的w+1位表示中的最高位会等于0,就算丢弃了最高位也不会改变值得大小,可能大家会很疑惑这事什么意思?
比如: 6+5 = 12 < 24(16),那么12的4位二进制表示 1100,w+1位的表示为01100,这就是上边说的w+1位表示中的最高位会等于0,就算把这个最高位去掉,结果变成4位1100,还是12,值不变
b. 2w < x + y < 2w+1 它的结果的w+1位表示中最高位会等于1,因此如果咱们把最高位丢弃了,它就相当于减去了2w ?????
比如:5+16 = 21,那么2w(16) < 21 < 2w+1(32),21的二进制是 10101,最高位是1,那么去掉最高位的话结果就是0101(5),结果 x + y - 2w,从上图可以看出 0 < x + y - 2w < 2w+1 - 2w = 2w ,结果就在0~2w 中,刚好x和y的和,然后再模2w 的结果
,该图就是对上边两种情况最好的表示
那么咱们说一个算术溢出,是指完整的正数结果不能放到该数据类型的字长限制中去,就像上边的例子一样,w位4位,最大值为16,计算出一个21,那么这就是算术溢出,21不能放到4位长度类型里边去,
如何判断是否发生了溢出呢??
比如: s = x + y;w=4, 0 <= x,y <= 2w
(1).当x + y >= x的时候,s就没有溢出,可以肯定s >= x;比如 1+13 = 14 < 2w 没有产生溢出,结果是14,那么 1+13 >= x
(2).当s确实溢出了,那么公式就是s = x + y - 2w ,比如 1+15 = 16 >= 2w ,产生了溢出,结果当然是0了,那么 s < x,就产生了溢出
加法逆元(必须满足 -x + x = 0):
a. x = 0,那么它的加法逆元就是0
b. x > 0,那么它的加法逆元就是 2w - x,这是为什么呢? 根据逆元运算 -x + x = 0 =====> x + 2w - x = 2w == 2w 溢出了,结果就是0
二、二进制补码加法
c 整数运算