程序中要慎用加法: 加法溢出情况举例, 求均值, 按位或(Bit OR)等

写程序中加法的使用要特别当心, 因为保不准会有溢出的情况, 这里举我实际中碰到过的两个例子, 一个是求两个数的平均值, 另一个是按照位进行或运算(Bit OR).

  1. 求int a,b; a和b的平均值:
// bad: overflow might occur
int c = (a + b) / 2;

// good, can avoid overflow
int c = a + (b - a) / 2
  1. Bit OR
    这种情况是这样的, 本来我使用一个int整型数据a上的每一位对bool逻辑的判断进行压缩处理, 也就是说int a有32位, 我使用这32个bit记录32种逻辑的真假, 那么一个新的逻辑过来了我只要按位或(Bit OR)上去就记录了该位bit上的逻辑, 举个例子, 比如
a = 0x00000010

我新来一个

b = 0x00000001

那么

a | b = 0x00000011

再清楚一点, 我想做的是这么一件事情: 用给一个int型的数据记录最多32种0/1状态, 一开始我使用了最低的16位记录16种状态, 然后又那么新的状态出现, 我打算用最高的第32, 31位作为记录状态的bit, 和原先老的状态用按位或就可以把最高的两位bit设置成我要的状态从而达到我的目的, 但是这里我犯了一个错误, 就是使用加法来达到目的, 乍一看似乎加法也可行, 但是加法的坏处就是可能存在溢出, 比如我有一种特殊的数据是32位全部设置成1的, 如果使用按位或就不会报overflow的错, 使用加法就报错了.

总之, 结论一句话, 加法的使用要特别当心, 小心overflow的问题.

(全文完,原创文章,转载时请注明作者和出处)


(转载本站文章请注明作者和出处 烟客旅人 sigmainfy — http://www.sigmainfy.com,请勿用于任何商业用途)

Written on February 19, 2014