2012-07-15 21 views
7

Cuando un número entero está fuera del rango del tipo, el valor máximo + 1 se suma/resta (depende de la parte del rango del número). Por ejemplo,¿Por qué las conversiones implícitas C funcionan como lo hacen?

unsigned short num = 65537; 

num tendrá un valor de 1 (65 536 se sustrajo). Mi pregunta es: ¿por qué sucede? Mi intuición me dice que tiene algo que ver con la bandera de acarreo y la bandera de desbordamiento, porque el valor máximo es siempre 1111 ....

¡Gracias de antemano!

+4

Trunca ... – Mehrdad

+0

Ejemplo perfecto de por qué debería compilarse básicamente con todas las advertencias posibles habilitadas. En cuanto a por qué eso está en el estándar sin embargo .... No tengo idea: p. (A menos que se refiera específicamente a 1. Eso es solo un desbordamiento de complementos de 2) – Corbin

+0

Ejemplo de dicho mensaje de advertencia: 'advertencia: entero grande truncado implícitamente al tipo sin firmar' – curiousguy

Respuesta

7

Para una máquina que utiliza en complemento a dos para enteros con signo las reglas para la conversión a un N bits tipo sin signo, son equivalentes a descartar todos, pero el bajo orden N bits. para hardware típico, esta es la forma más fácil de hacer la conversión.

El estándar permite otras representaciones para enteros con signo, pero usa las mismas reglas de conversión por razones de consistencia. Esto podría requerir un trabajo adicional en tales máquinas, pero (a) tales máquinas son bastante raras, y (b) el gasto debería ser bastante pequeño de todos modos.

Cuestiones relacionadas