print - c++ data types
¿Cómo imprimo el tamaño de int en C? (3)
Estoy tratando de compilar lo siguiente en RHEL 5.6, 64 bit, y sigo recibiendo una advertencia
"var.c: 7: advertencia: el formato ''% d'' espera el tipo ''int'', pero el argumento 2 tiene el tipo ''long unsigned int''"
Aquí está mi código:
#include <stdio.h>
#include <stdlib.h>
int main()
{
unsigned int n =10;
printf("The size of integer is %d/n", sizeof(n));
}
No importa si cambio la declaración de "n" a la siguiente
- firmado int n = 10;
- int n = 10;
Todo lo que quiero hacer es imprimir el tamaño del entero en mi máquina, sin realmente mirar los límites. H.
Creo que deberías escribir esto en su lugar:
printf("The size of integer is %d/n", sizeof(int));
La función sizeof devuelve un tipo size_t
. Intente usar %zu
como el especificador de conversión en lugar de %d
.
printf("The size of integer is %zu/n", sizeof(n));
Para aclarar, use %zu
si su compilador soporta C99; de lo contrario, o si desea una máxima portabilidad, la mejor manera de imprimir un valor de size_t
es convertirlo a un unsigned long
y usar %lu
.
printf("The size of integer is %lu/n", (unsigned long)sizeof(n));
La razón de esto es que el estándar garantiza que size_t
sea un tipo sin firma; sin embargo, el estándar no especifica que debe ser de un tamaño particular (lo suficientemente grande como para representar el tamaño de cualquier objeto). De hecho, si unsigned long no puede representar el objeto más grande para su entorno, es posible que incluso tenga que usar un especificador de %llu
long long long sin firmar y %llu
.
En C99, se agregó el modificador de longitud z para proporcionar una manera de especificar que el valor que se está imprimiendo es el tamaño de un tipo size_t. Al utilizar %zu
, está indicando que el valor que se está imprimiendo es un valor sin signo de size_t
.
Esta es una de esas cosas en las que parece que no deberías pensar en ello, pero sí lo haces.
Otras lecturas:
Su problema es que size_t es un tipo sin signo. Intenta usar
printf("The size of integer is %u/n", sizeof(n));
y deberías deshacerte de esa advertencia.