C / C ++ desbordamiento de entero sin signo

Estoy leyendo un artículo sobre seguridad de enteros. aquí está el enlace: http://ptgmedia.pearsoncmg.com/images/0321335724/samplechapter/seacord_ch05.pdf

En la página 166, se dice:

Un cómputo que involucre operandos sin firmar nunca puede sobrevolverse, porque un resultado que no puede ser representado por el tipo de entero sin signo resultante es módulo reducido al número que es uno mayor que el valor más grande que puede ser representado por el tipo resultante.

Qué significa eso? apreciar por respuesta.

Significa que el valor “se envuelve”.

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

.. y así

Como dice el enlace, esto es como el operador de módulo: http://en.wikipedia.org/wiki/Modulo_operation

Significa que no puede alterar el signo de un cálculo unsigned , pero aún puede producir resultados inesperados. Digamos que tenemos un valor sin signo de 8 bits:

  uint8_t a = 42; 

y agregamos 240 a eso:

  a += 240; 

no encajará, entonces obtienes 26.

Las matemáticas sin firmar están claramente definidas en C y C ++, donde la matemática firmada es técnicamente indefinida o depende de la implementación o de alguna otra fraseología de “cosas que no esperarías que ocurra” (no sé la redacción exacta, pero la conclusión es que “no deberías confiar en el comportamiento del desbordamiento en valores enteros con signo”)

Sin desbordamiento?

“Desbordamiento” aquí significa “producir un valor que no se ajusta al operando”. Debido a que se aplica el módulo aritmético, el valor siempre se ajusta al operando, por lo tanto, no hay desbordamiento.

En otras palabras, antes de que el desbordamiento pueda suceder realmente, C ++ ya habrá truncado el valor.

Modulo?

Tomar un módulo de valor con algún otro valor significa aplicar una división y tomar el rest.

Por ejemplo:

 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) ... 

Este módulo se aplica a los resultados de cálculos sin firmar, con el divisor como el valor máximo que puede contener el tipo. Por ejemplo, si el máximo es 2 ^ 16 = 32768, entonces 32760 + 9 = (32760 + 9) % (32768+1) = 0 .