IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    C陷阱与缺陷之整数溢出

    TacuLee发表于 2016-04-01 17:54:39
    love 0

    C语言中存在两类整数算术运算,有符号运算与无符号运算。在无符号算术运算中,没有所谓的“溢出”一说:所有的无符号运算都是以2的n次方为模,这里n是结果中的位数。如果算术运算符的一个操作数是有符号整数,另一个是无符号整数,那么有符号整数会被转换为无符号整数,“溢出”也不可能发生。但是,当两个操作数都是有符号整数时,“溢出”就有可能发行,而且“溢出”的结果是未定义的。当一个运算的结果发生“溢出”时,作出任何假设都是不安全的。

    例如,假定a和b是两个非负整型变量,我们需要检查a+b是否会“溢出”。一种想当然的方式是这样:

    if(a+b<0)
      complain();

    这并不能正常运行。当a+b确实发生“溢出”时,所以关于结果如何的假设都不再可靠。例如,在某些机器上,加法运算将设置一个内部寄存器为四种状态之一:正、负、零和溢出。在这种机器上,C编译器完全有理由这样来实现上面的例子,即a与b相加,然后检查该内部寄存器的标志是否为“负”。当加法操作发生“溢出”时,这个内部寄存器的状态是溢出而不是负,那么if的语句的检查就会失败。

    一种正确的方式是将a和b都强制转换为无符号整数:

    if((unsigned)a+(unsigned)b>INT_MAX)
      complain();

    未经允许不得转载:TacuLee » C陷阱与缺陷之整数溢出



沪ICP备19023445号-2号
友情链接