我正在使用 C 中的整数,试图探索更多关于何时以及如何发生溢出的信息。
我注意到,当我添加两个正数时,其总和会溢出,我总是得到一个负数。
另一方面,如果我添加两个负数,其总和溢出,我总是得到一个正数(包括 0)。
我做了一些实验,但我想知道这是否适用于所有情况。
整数溢出是 C 中未定义的行为。
C 表示涉及整数的表达式溢出,如果通常算术转换后的结果是有符号类型的并且不能用结果的类型表示。赋值和强制转换表达式是一个例外,因为它们受整数转换的约束。
无符号类型的表达式不能溢出;他们包裹,例如,0U - 1
is UINT_MAX
.
例子:
INT_MAX + 1 // integer overflow
UINT_MAX + 1 // no overflow, the resulting type is unsigned
(unsigned char) INT_MAX // no overflow, integer conversion occurs
永远不要让任何整数表达式溢出;现代编译器(例如gcc
)利用整数溢出作为未定义行为来执行各种类型的优化。
例如:
a - 10 < 20
when a
属于类型int
提升后,表达量减少gcc
(启用优化时):
a < 30
它利用了表达式未定义的行为a
是在范围内INT_MIN + 10 - 1
to INT_MIN
.
当以下情况时无法完成此优化a
is unsigned int
因为如果a
is 0
, then a - 10
必须被评估为UINT_MAX - 9
(没有未定义的行为)。优化a - 10 < 20
to a < 30
然后会导致与所需结果不同的结果a
is 0
to 9
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)