traduccion que c types integer integer-overflow

traduccion - integer overflow que es



short int Integer wrap around/short int inversión en c no entendido, diferencia entre asignación e impresiones (3)

Bueno, para imprimir un short , necesitas usar un modificador de longitud.

Cambie la cadena de formato a %hd .

El siguiente fragmento de código

short int k = -32768; printf("%d /n", -k); k=-k; printf("%d /n", k);

huellas dactilares

32768 -32768

Supongo que ambas impresiones son iguales. ¿Alguien puede explicar cuál es la diferencia y por qué la asignación k=-k causa un envolvimiento? Fue difícil encontrar una explicación en línea, ya que realmente no sé qué googlear.


Porque SHRT_MIN = -32768 y SHRT_MAX = +32767 . Mira cómo funciona el complemento a 2.

Editar

De hecho, de acuerdo con el estándar internacional del lenguaje de programación C (es decir , Borrador del Comité - 6 de mayo de 2005 , págs. 50-51) con respecto a los enteros con signo:

Para los tipos enteros con signo, los bits de la representación del objeto se dividirán en tres grupos: bits de valor, bits de relleno y el bit de signo.

No es necesario que haya ningún relleno; habrá exactamente un bit de signo.

Cada bit que es un bit de valor tendrá el mismo valor que el mismo bit en la representación del objeto del tipo sin signo correspondiente (si hay M bits de valor en el tipo con signo y N en el tipo sin signo, entonces M <= N).

Si el bit de signo es cero, no afectará el valor resultante.

Si el bit de signo es uno, el valor se modificará de una de las siguientes maneras:

  • el valor correspondiente con el bit de signo 0 es negado (signo y magnitud);

  • el bit de signo tiene el valor - (2 N ) (complemento de dos);

  • el bit de signo tiene el valor - (2 N - 1) (complemento de unos).

Cuál de estos aplica es definido por implementación , como si el valor con el bit de signo 1 y todos los bits de valor cero (para los dos primeros) o con el bit de signo y todos los bits de valor 1 (para el complemento de uno) es una representación trampa o un valor normal En el caso de signo y magnitud y el complemento de uno, si esta representación es un valor normal, se llama cero negativo.

Entonces, en otras palabras, en tu caso parece que se está usando el complemento 2, pero no se debe suponer que esté en todas las plataformas y compiladores.


-32768 es 8000 en notación hexadecimal. 32768 no se puede representar como un número de 16 bits con signo, por lo tanto, el compilador promueve -k a un int con el valor hexadecimal 00008000 . Cuando este número se asigna a la variable de 16 bits, los bits altos se truncan, lo que da como resultado 8000 o -32768 nuevamente.