首页 > 代码库 > c 整数运算

c 整数运算

一、无符号加法(形式的模运算,无符号加法等价于计算模2w 的和)

  示例:非负数 x 和 y

  位数: w(8位机)

  范围: 0 <= x,y <= 2-1 

  结果:0 <= x+y <= (2-1 + 2-1)  ====>  0 <= x+y <= 2w +1-2  

  比如:200 + 100 = 300 (2-1 <= 300 <=  2w +1-2 )  ====> 300 mod 2w(256) = 44

  过程:300转换成二进制:100101100,但是咱们是8位机,我们从右往左数,左边的是高位,右边的是低位,把去高位舍去,保留8位:00101100(转换成10进制就是44)

  那么这里就会出现一个很重要的概念:溢出?拿上边的示例来说明:当x + y > 2-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~2中,刚好x和y的和,然后再模2的结果

  技术分享,该图就是对上边两种情况最好的表示

  那么咱们说一个算术溢出,是指完整的正数结果不能放到该数据类型的字长限制中去,就像上边的例子一样,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 整数运算