me escribió este pequeño código:printf de una variable size_t con identificadores de tipo de LLD, LD y d
#include <stdio.h>
int main() {
size_t temp;
temp = 100;
printf("lld=%lld, ld=%ld, u=%u\n", temp, temp, temp);
return 0;
}
Estoy funcionando esto en una máquina i386 GNU/Linuxcon versión de gcc 4.1.1 20070105 (Red Hat 4.1.1-52). Esta es la salida que me dieron:
lld=429496729700, ld=100, u=7993461
Puedo entender que la primera (lld
) se imprimió como basura porque los printf
intentos para imprimir 8 bytes (para signed long long
como indica lld
) cuando sólo 4 bytes están disponibles de la variable temp
. Pero no entiendo por qué el último identificador, u
se está imprimiendo como basura, mientras que, en mi entender, este es el identificador aplicable más cercano para size_t
.
Aquí he supuesto que size_t
es unsigned int
(que tiene 4 bytes firmados para mi i386).
Ahora, lo hice un poco de ajuste con la línea printf
:
...
printf("ld=%ld, u=%u, lld=%lld\n", temp, temp, temp);
...
y tengo una respuesta perfectamente bien (excepto la parte lld
).
ld=100, u=100, lld=34331653576851556
¿Puede alguien ayudarme a comprender qué es exactamente lo que me falta aquí?
¡Muchas gracias por cualquier ayuda!
[nota al margen: He intentado cambiar la optimización del uso de gcc -O[0,2]
etiqueta de encendido/apagado sin ninguna diferencia en la observación.]
La opción -What probablemente detectará esta incompatibilidad por usted. – Clifford
@Clifford Gracias por la entrada, pero estaba usando deliberadamente especificadores incorrectos. De hecho, quería saber cómo 'printf' estaba consumiendo los elementos en la pila. De hecho, creo que Wall también tendría lo mismo. Sin embargo, muchas gracias. – Shrey
Me doy cuenta de que fue deliberado; pero mi punto era que si la intención era observar el comportamiento del compilador, la opción -Wformat demuestra un comportamiento alternativo (y más seguro), que puede haber sido de interés para alguien, incluso si ya lo sabía. -Wall no incluyó -What en versiones anteriores de GCC. – Clifford