为什么以下程序会发生溢出?

时间:2017-08-12 17:21:05

标签: c integer integer-overflow

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

任何人都可以帮助我理解上述程序中可能出现溢出的原因吗?

3 个答案:

答案 0 :(得分:13)

可能会发生溢出,因为二进制补码中的整数表示范围不对称:可以表示的最小负数的大小是可以表示的最高正数的大小加一。例如,在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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

  • 嗯,在您的情况下,变量i未初始化。那么这里会发生的是,分配给整数类型的变量i的内存空间将包含一些垃圾值。
  • 如果内存地址包含最大可能的整数值-2^31(-2,147,483,648),那么否定此值将导致整数溢出。

我希望这会有所帮助。