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;