c/c++开发分享为什么以下程序会发生溢出?

void main () { int i; if (i < 0) { i = -i; }; } 

任何人都可以帮我理解为什么在上述程序中可能出现溢出?

    可能会发生溢出,因为二进制补码中的整数表示范围不对称:可以表示的最小负数的大小是可以表示的最高正数的大小加一。 例如,在32位系统上,值为-2,147,483,6482,147,483,647 。 这就是为什么否定-2,147,483,648会导致溢出:否定的结果,正值2,147,483,648 ,不能用相同大小的int表示。

    请注意,此问题的反之亦然:否定正数不会导致溢出:

     if (i > 0) { i = -i; } // No overflow here 

    堆栈中的“i”值在主启动时未定义。 调用main()之前运行的启动代码可以在那里留下任何东西。

    加上Kashif所说的,负整数可以比非负整数低一个值,因为负数不需要留下零空间。 符号位中的“1”,所有剩余的位为零,当符号反转时会导致溢出。

    在16位:-0x8000 == ~0x8000 + 1 == 0x7FFF + 1 == 0x8000
    //“ – ”负值==反转+ 1 ==倒置+ 1 ==最终是相同的

    这个值的可能性很低,但存在。 除非堆栈恰好包含有问题的数字,否则不会发生。

    整数溢出的原因是算术运算尝试创建一个数值,该数值超出了可以用给定位数表示的范围,该位数大于最大值或小于最小可表示值。

    我希望这有帮助。

      以上就是c/c++开发分享为什么以下程序会发生溢出?相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注(猴子技术宅)。

      本文来自网络收集,不代表猴子技术宅立场,如涉及侵权请点击右边联系管理员删除。

      如若转载,请注明出处:https://www.ssfiction.com/c-cyuyankaifa/545826.html

      发表评论

      电子邮件地址不会被公开。 必填项已用*标注