C / C ++无符号整数溢出

时间:2013-04-17 09:44:46

标签: c++ c

我正在读一篇关于整数安全性的文章。 这是链接: http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf

在第166页,有说:

  

涉及无符号操作数的计算永远不会溢出,因为a   结果无法由结果无符号整数表示   type以模数减少为大于1的数   可以由结果类型表示的最大值。

这是什么意思?感谢您的回复。

3 个答案:

答案 0 :(得分:23)

这意味着价值“环绕”。

UINT_MAX + 1 == 0
UINT_MAX + 2 == 1
UINT_MAX + 3 == 2

..等等

正如链接所说,这就像模运算符:http://en.wikipedia.org/wiki/Modulo_operation

答案 1 :(得分:4)

没有溢出?

“溢出”这里的意思是“生成一个不适合操作数的值”。由于应用了算术模数,因此该值始终适合操作数,因此不会溢出。

换句话说,在溢出实际发生之前,C ++已经截断了值。

模?

取一个值为其他值的模数意味着应用除法,并取余数。

例如:

0 % 3 = 0  (0 / 3 = 0, remainder 0)
1 % 3 = 1  (1 / 3 = 0, remainder 1) 
2 % 3 = 2  (2 / 3 = 0, remainder 2)
3 % 3 = 0  (3 / 3 = 1, remainder 0)
4 % 3 = 1  (4 / 3 = 1, remainder 1)
5 % 3 = 2  (5 / 3 = 1, remainder 2)
6 % 3 = 0  (6 / 3 = 2, remainder 0)
...

此模数应用于仅无符号计算的结果,除数是该类型可容纳的最大值。例如,如果最大值是2 ^ 16 = 32768,那么32760 + 9 = (32760 + 9) % (32768+1) = 0

答案 2 :(得分:4)

这意味着您无法更改unsigned计算的符号,但仍会产生意外结果。假设我们有一个8位无符号值:

 uint8_t a = 42;

我们加上240:

 a += 240;

它不合适,所以你得到26。

无符号数学在C和C ++中有明确定义,其中有符号数学在技术上要么是未定义的,要么是依赖于实现的,或者其他一些“你不会发生的事情可能会发生”的措辞(我不知道确切的措辞,但是结论是“你不应该依赖有符号整数值的溢出行为”)

相关问题