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

我正在读一篇关于整数安全的文章。 这里是链接: http : //ptgmedia.pearsoncmg.comhttp://img.dovov.com0321335724/samplechapter/seacord_ch05.pdf

在第166页,有说:

涉及无符号操作数的计算永远不会溢出,因为无法用结果无符号整数types表示的结果被模数减less到大于可由结果types表示的最大值的数。

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

这意味着价值“包裹”。

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

.. 等等

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

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

  uint8_t a = 42; 

我们加上240:

  a += 240; 

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

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

没有溢出?

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

换句话说,在溢出实际发生之前,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) ... 

这个模适用于无符号计算的结果,除数是types可以容纳的最大值。 例如,如果最大值是2 ^ 16 = 32768,则32760 + 9 = (32760 + 9) % (32768+1) = 0