2012-02-08 42 views
15

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

unsigned int someint = 253473829*13482018273; 
+0

Esto parece ser un duplicado de http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c –

+1

¿Por qué no lo intentas y ves lo que obtienes? En general, cuando un int sin signo se desborda, pasa a cero. Por lo tanto, 'UINT_MAX + 5' pasa a ser 4. –

+0

. Sería la diferencia entre el valor máximo de uint y el valor de lo que habría sido el valor de desbordamiento. Vamos a hacerlo simple. Digamos que max uint es 5. Desea agregar 2 * 4, por lo que el valor final es 3 en lugar de 8. –

Respuesta

22

unsigned números no pueden desbordarse, sino que envuelva alrededor de usar las propiedades del módulo.

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


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

unsigned int someint = 253473829U * 13482018273U; 
+0

¿es eso parte de un estándar? –

+2

@Zhenya Sí, tanto en C como en C++. – Pubby

+0

@Zhenya - ¿Importa? La respuesta es 100% correcta. Es una forma más técnica de decir UINT_MAX + 5 es 4. Esto probablemente seguiría siendo cierto en ambos lenguajes .NET y Java. Al menos en el caso de .NET NaN está limitado a tipos como el doble donde el valor (la mayoría del tiempo) no está representado exactamente. –

5

sin signo de desbordamiento de enteros, a diferencia de sus homólogos firmado, exposiciones comportamiento bien definido.

Los valores básicamente se "envuelven". Es seguro y se usa comúnmente para funciones de cuenta regresiva o hashing/mod.

+3

Unsigned no se desborda –

+1

Quería decir que, a modo de comparación, intenté explicarlo relacionándome con algo similar. Califiqué mi declaración más tarde con el término "wrap around bit". Ah, tecnicismos. – evandrix

-3

Probablemente dependa un poco de su compilador. Tuve errores como este hace años, y algunas veces obtenía un error de tiempo de ejecución, otras veces básicamente "volvía" a un número realmente pequeño que resultaría de cortar los bits de más alto nivel y dejar el resto, es decir, si es un 32 bit unsigned 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 tendrías que probarlo en tu compilador para ver exactamente lo que obtienes, que puede no ser lo mismo que obtendrías con un compilador diferente, especialmente si el desbordamiento ocurre en el medio de una expresión donde el resultado final está dentro del compilador. rango de un int sin signo

+0

** El desbordamiento de Unsigned ** no depende del compilador, está estandarizado para tener semántica envolvente. Solo el desbordamiento ** signed ** genera valores indefinidos y, por lo tanto, puede depender del compilador. – cmaster

Cuestiones relacionadas