Imprimir un int largo largo como int genera un valor negativo [cerrado]

¿Por qué este simple programa en C imprime -2147483648?

#include <stdio.h>

int main(){
    printf("%i", (int)2147483648);
    return 0;
}

Por supuesto, si no lo lanzo y uso %lld como especificador de formato, obtengo el resultado esperado.

preguntado el 28 de agosto de 12 a las 13:08

Tú lees hackerschool.com/blog/5-aprendiendo-c-con-gdb ¿no es así? Lo leí hace 5 minutos y me detuve un minuto ante la misma pregunta. -

4 Respuestas

2147483647 es el valor máximo de int en tu plataforma.

2147483648 == 0x80000000 tiene la misma representación binaria que -2147483648, por eso obtuviste ese resultado.

Respondido 28 ago 12, 13:08

Al convertir un entero a un tipo con signo más pequeño, el comportamiento está definido por la implementación si el valor no se puede representar en el nuevo tipo:

6.3.1.3

Cuando un valor con tipo entero se convierte a otro tipo entero que no sea _Bool, si el valor se puede representar con el nuevo tipo, no se modifica.

[...]

De lo contrario, el nuevo tipo se firma y el valor no se puede representar en él; el resultado está definido por la implementación o se genera una señal definida por la implementación.

Respondido 28 ago 12, 13:08

¿Dónde puedo leer sobre el comportamiento "definido"? - Paul

Solo si se desborda, está bien: (int) (unsigned long long) 3. - orlp

@nightcracker Buena decisión, arreglé la redacción. - cnicutar

Cuando lanzas a un int, estás (al menos en tu plataforma actual) transmitiendo a un número con signo de 32 bits. El valor positivo más grande que se puede almacenar en ese espacio es 2147483647. Cuando agrega 1, pasa al valor negativo más grande, que es la salida.

Cuando se utiliza long long int, creo que el ancho mínimo es de 64 bits. Puede mantener fácilmente el valor 2147483648 en ese espacio, por lo que el resultado es el esperado.

Respondido 28 ago 12, 13:08

En un sistema de complemento a dos de 32 bits, el máximo int es usualmente:

2147483647

so

2147483648

es un long .

La conversión de un valor a un tipo firmado cuando el valor no cabe en el tipo firmado está definida por la implementación.

Respondido 28 ago 12, 13:08

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.