¿Cómo imprimo el tamaño de int en C?

4 minutos de lectura

avatar de usuario
Jimm

Estoy tratando de compilar lo siguiente en RHEL 5.6, 64 bits, y sigo recibiendo una advertencia

“var.c:7: advertencia: el formato ‘%d’ espera el tipo ‘int’, pero el argumento 2 tiene el tipo ‘int largo sin firmar'”

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

  1. entero con signo n = 10;
  2. entero n = 10;

Todo lo que quiero hacer es imprimir el tamaño de un número entero en mi máquina, sin mirar realmente los límites. h.

  • posible duplicado de los especificadores de formato size_t independientes de la plataforma en c?

    – maxschlepzig

    1 de marzo de 2014 a las 13:29

  • ¿Posible duplicado de cadena de formato multiplataforma para variables de tipo size_t?

    – Ciro Santilli Путлер Капут 六四事

    2 oct 2015 a las 9:34

  • Posible duplicado de ¿Cuál es la forma correcta de usar printf para imprimir un size_t?

    – phuclv

    6 de mayo de 2017 a las 9:12

avatar de usuario
robert arboledas

La función sizeof devuelve un size_t escribe. Intenta usar %zu como el especificador de conversión en lugar de %d.

printf("The size of integer is %zu\n", sizeof(n));

Para aclarar, utilice %zu si su compilador es compatible con C99; de lo contrario, o si desea la máxima portabilidad, la mejor manera de imprimir un size_t el valor es convertirlo a unsigned long y use %lu.

printf("The size of integer is %lu\n", (unsigned long)sizeof(n));

La razón de esto es que el size_t está garantizado por el estándar para ser un tipo sin firmar; sin embargo, el estándar no especifica que debe tener un tamaño particular (solo lo suficientemente grande 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 necesite usar una conversión larga sin signo y %llu especificador

En C99, se agregó el modificador de longitud z para proporcionar una forma de especificar que el valor que se está imprimiendo es del tamaño de un tipo size_t. Mediante el uso %zu está indicando que el valor que se está imprimiendo es un valor sin firmar de size_t Talla.

Esta es una de esas cosas en las que parece que no deberías tener que pensar en ello, pero lo haces.

Otras lecturas:

  • Gracias Jim, me di cuenta de eso y estaba en medio de una edición para agregar más aclaraciones/explicaciones.

    – Robert Groves

    10 de mayo de 2011 a las 0:56

  • Roberto, gracias por la explicación. ¿También sabrías dónde se declara size_t? Investigué sys/types.h, stdio.h, stdlib.h, pero no pude encontrar la definición de size_t para gcc 4.1 en mi sistema. Además, no tengo stddef.h

    – Jimm

    10 de mayo de 2011 a las 1:08

  • size_t debe definirse en stddef.h para C. (cstddef para C++)

    – Robert Groves

    10 de mayo de 2011 a las 1:14

  • Podrías simplemente enviar el resultado a intya que sizeof(int) seguramente encaja int.

    – R.. GitHub DEJA DE AYUDAR A ICE

    10 de mayo de 2011 a las 1:21

  • @Jimm Sí, tiene stddef.h: todos los sistemas ANSI C lo proporcionan.

    –Jim Balter

    10 de mayo de 2011 a las 1:23

Su problema es que size_t es un tipo sin firmar. Intenta usar

printf("The size of integer is %u\n", sizeof(n));

y deberías deshacerte de esa advertencia.

  • Gracias, tu explicación ayuda.

    – Jimm

    10 mayo 2011 a las 0:30

  • Tenga en cuenta que esto no es portátil a los sistemas donde size_t y unsigned int tener diferentes longitudes.

    –Jim Balter

    10 de mayo de 2011 a las 0:52


  • @Jim Balter: Cierto, algo así como printf(“El tamaño del entero es %zu\n”, sizeof(n)); en GCC o printf(“El tamaño del entero es %Iu\n”, sizeof(n)); en MSVC son más portátiles, sin embargo, no conozco una manera fácil de escribir esto para el caso general.

    – Aurojit Panda

    10 de mayo de 2011 a las 3:05

  • Ya que sizeof(int) debe ser un entero pequeño, %u y echando a (unsigned) haría en este caso.

    –Jim Balter

    10 de mayo de 2011 a las 5:52


Creo que deberías escribir esto en su lugar:

printf("The size of integer is %d\n", sizeof(int));

  • Esto aún devuelve la advertencia var.c:7: advertencia: el formato ‘%d’ espera el tipo ‘int’, pero el argumento 2 tiene el tipo ‘int largo sin firmar’

    – Jimm

    10 de mayo de 2011 a las 0:28


  • @SIFE Tengo curiosidad por saber por qué cree que eso produciría un resultado diferente.

    –Jim Balter

    10 de mayo de 2011 a las 0:50

  • @Jim Si no lo olvido, esta fue la forma correcta de ver el tamaño de los tipos en C.

    – SIFE

    10 mayo 2011 a las 20:30

  • @SIFE sizeof(int) y sizeof(n) (donde n fue declarado como int) tienen el mismo valor. Parece que no comprende los problemas aquí; consulte las otras respuestas y comentarios para hacerlo.

    –Jim Balter

    10 mayo 2011 a las 20:59


  • @Jim, no dije que estaba equivocado, todo lo que dije fue cómo debería escribirse.

    – SIFE

    10 mayo 2011 a las 22:34

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad