编程自学网编程自学网编程自学网

C中标准和编译器中的整数溢出

问题描述:

由Carl Norum编辑,包括适当的标准参考。

C标准规定

如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。

是否有编译器开关可以保证整数溢出时的某些行为?我想避免鼻腔恶魔。特别是,我想强制编译器包装溢出。

为了唯一性,让标准为C99,编译器为gcc。但我会对其他编译器(icc,cl)和其他标准(C1x,C89)的答案感兴趣。事实上,只是为了惹恼C / C ++人群,我甚至欣赏C ++ 0x,C ++ 03和C ++ 98的答案。

注:国际标准ISO / IEC 10967-1可能与此相关,但据我所知,仅在资料性附录中提到过。


答案:

对于你的C99答案,我认为6.5表达式,第5段是你正在寻找的:

如果在计算表达式期间发生异常情况(即,如果结果未在数学上定义或未在其类型的可表示值范围内),则行为未定义。

这意味着如果你遇到溢出,你就不走运了 - 没有任何保证的行为。无符号类型是一种特殊情况,永不溢出(6.2.5类型,第9段):

涉及无符号操作数的计算永远不会溢出,因为无法通过生成的无符号整数类型表示的结果将以比结果类型可以表示的最大值大1的数量为模。

C ++有相同的陈述,措辞有点不同:

  • 5表达,第4段: 如果在评估表达式期间,结果未在数学上定义或未在其类型的可表示值范围内,则行为未定义。 [注意:大多数现有的C ++实现忽略整数溢出。除零处理,使用零除数形成余数,所有浮点异常因机器而异,通常可通过库函数调整。 -endnote]

  • 3.9.1基本类型,第4段: 无符号整数,声明为unsigned,应遵守算术模2 ^ n的定律,其中n是该特定整数大小的值表示中的位数。


未经允许不得转载:编程自学网 » C中标准和编译器中的整数溢出