c++ integer-overflow unsigned-integer

c++ - Desbordamiento de int sin firmar



integer-overflow unsigned-integer (3)

¿Qué contendrá el unsigned int cuando lo desborde? Para ser específico, quiero hacer una multiplicación con dos unsigned int : ¿qué habrá en el unsigned int después de que se unsigned int la multiplicación?

unsigned int someint = 253473829*13482018273;


El desbordamiento de enteros sin firmar, a diferencia de su contraparte firmado, muestra un comportamiento bien definido.

Los valores básicamente "envuelven" alrededor. Es seguro y se usa comúnmente para la cuenta regresiva, o funciones hash / mod.


Probablemente depende un poco de tu compilador. Tuve errores como estos años atrás, y algunas veces obtendría un error de tiempo de ejecución, otras veces básicamente se "ajustaría" a un número realmente pequeño que resultaría de cortar los bits de nivel más alto y dejar el resto, es decir, si es un error de 32 bits. bit sin firmar int, y el resultado de su multiplicación sería un número de 34 bits, cortaría los 2 bits de orden superior y le daría el resto. Probablemente tenga que probarlo en su compilador para ver exactamente lo que obtiene, que puede no ser lo mismo que obtendría con un compilador diferente, especialmente si el desbordamiento ocurre en medio de una expresión donde el resultado final está dentro de Rango de un int sin firmar.


unsigned números unsigned no se pueden desbordar, sino que se envuelven utilizando las propiedades de módulo.

Por ejemplo, cuando unsigned int es de 32 bits, el resultado sería: (a * b) mod 2^32 .

Como señaló CharlesBailey, 253473829*13482018273 puede usar la multiplicación con 253473829*13482018273 antes de convertirse, por lo que debe ser explícito acerca de unsigned antes de la multiplicación:

unsigned int someint = 253473829U * 13482018273U;