Tomas Owens
los printf
función toma un tipo de argumento, como %d
o %i
para signed int
. Sin embargo, no veo nada para un long
valor.
posfuturista
Poner un l
(letra L minúscula) directamente antes del especificador.
unsigned long n;
long m;
printf("%lu %ld", n, m);
-
printf("%ld", ULONG_MAX)
genera el valor como -1. Debiera serprintf("%lu", ULONG_MAX)
por tiempo sin firmar como se describe a continuación por @Blorgbeard.– Jammus
12 de noviembre de 2011 a las 16:03
-
En realidad, deberías cambiarlo para que sea
%ld
para ser más armónico con la pregunta OP.– DrBeco
21 de junio de 2015 a las 5:28
-
Sí, Dr. Beco; más allá, solo
%l
disparadoreswarning: unknown conversion type character 0x20 in format [-Wformat]
–Patricio Bertoni
29 de julio de 2015 a las 10:53
Barbarroja
Creo que quieres decir:
unsigned long n;
printf("%lu", n); // unsigned long
o
long n;
printf("%ld", n); // signed long
david dopson
En la mayoría de las plataformas, long
y int
son del mismo tamaño (32 bits). Aún así, tiene su propio especificador de formato:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Para 64 bits, querrías un long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Ah, y por supuesto, es diferente en Windows:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Con frecuencia, cuando estoy imprimiendo valores de 64 bits, encuentro útil imprimirlos en hexadecimal (generalmente con números tan grandes, son punteros o campos de bits).
unsigned long long n;
printf("0x%016llX", n); // "0x" followed by "0-padded", "16 char wide", "long long", "HEX with 0-9A-F"
imprimirá:
0x00000000DEADBEEF
Por cierto, “largo” ya no significa tanto (en la corriente principal x64). “int” es el tamaño int predeterminado de la plataforma, normalmente 32 bits. “largo” suele ser del mismo tamaño. Sin embargo, tienen una semántica de portabilidad diferente en plataformas más antiguas (¡y plataformas integradas modernas!). “largo largo” es un número de 64 bits y, por lo general, lo que las personas querían usar a menos que realmente supieran lo que estaban haciendo al editar una pieza de código portátil de la plataforma x. Incluso entonces, probablemente habrían usado una macro para capturar el significado semántico del tipo (por ejemplo, uint64_t).
char c; // 8 bits
short s; // 16 bits
int i; // 32 bits (on modern platforms)
long l; // 32 bits
long long ll; // 64 bits
En el pasado, “int” era de 16 bits. Uno pensaría que ahora sería de 64 bits, pero no, eso habría causado problemas de portabilidad increíbles. Por supuesto, incluso esto es una simplificación de la verdad arcana y rica en historia. Ver wiki:Entero
-
Solo para aclarar: hay más arquitecturas que x86 y x64, y en esas arquitecturas, char, short, int, long y long long tienen significados diferentes. Por ejemplo, un mcu de 32 bits con alineación de memoria de 16 bits podría usar: char=short=int=16 bit; largo=32 bits; largo largo = 64 bits
– AndrésR
6 sep 2016 a las 19:19
-
@AndresR: absolutamente, y es muy importante para las personas que realizan programación integrada (una vez construí un módulo kernel para una alarma de humo). Lástima de esas pobres almas cuando intentan usar un código que no fue escrito para la portabilidad.
– Dave Dopson
7 sep 2016 a las 19:44
-
No estoy tan seguro de que “la mayoría de las plataformas tengan un
long
eso es de tamaño 32″ sigue siendo cierto. Por ejemplo, estoy en Oracle Linux x86_64/amd64, y connvcc
along
es de 8 bytes.– parteinteresada333
17 de junio de 2019 a las 18:02
-
“Ah, y por supuesto, es diferente en Windows”. ¿Existe una solución multiplataforma?
– Aarón Franke
13 de mayo de 2020 a las 9:05
-
@interestedparty333 Sí, estoy >95% seguro de que en Linux
long
tiene el mismo tamaño que la palabra/puntero (es decir, 32 bits en Linux de 32 bits y 64 bits en Linux de 64 bits). Si mira dentro del código del kernel de Linux o dentro de los controladores de Linux, generalmente almacenan punteros enlong
ounsigned long
variables De hecho, hace unas semanas, un colega mío que portó un código de Windows a Linux tuvo que ir y cambiar todos nuestroslong
s auint32_t
porque los maltrataríamos constantemente al desarrollar bajo Windows.– AnthonyD973
19 de febrero de 2021 a las 22:21
Depende, si se refiere a largo sin firmar, el carácter de formato es "%lu"
. Si te refieres a firmado largo, el carácter de formato es "%ld"
.
Rob Walker
Dolan Antenucci
En caso de que esté buscando imprimir unsigned long long
como estaba, uso:
unsigned long long n;
printf("%llu", n);
Para todas las demás combinaciones, creo que usas la tabla de el manual de impresióntomando la fila, luego la etiqueta de la columna para cualquier tipo que esté tratando de imprimir (como hago con printf("%llu", n)
arriba).
Andrew O´Reilly
Creo que para responder definitivamente a esta pregunta sería necesario conocer el nombre y la versión del compilador que está utilizando y la plataforma (tipo de CPU, sistema operativo, etc.) para la que se está compilando.
-
Su respuesta debe ser un comentario y no una respuesta en sí misma.
– Jaime Hablutzel
29 de agosto de 2019 a las 5:01
-
No: no hay dependencia de la plataforma en el formato correcto para imprimir un
long
– la respuesta correcta es%ld
. El rango de valores que se pueden imprimir depende de la plataforma, en algunas plataformaslong
será de 32 bits (especialmente en 2008) y en otras plataformas será de 64 bits (especialmente en 2022 y posteriores). Pero si el tipo de datos eslong
lo correctoprintf()
el especificador de conversión es%ld
(aunque puedes usar%li
).–Jonathan Leffler
Hace 8 horas
No lo use por mucho tiempo, no es portátil. stackoverflow.com/questions/16859500/mmh-quien-eres-priu64
– Marcha
23 de noviembre de 2019 a las 1:02
@MarcH – tampoco lo es
int
portátil. Históricamente,int
era un valor de 16 bits; también ha sido un valor de 64 bits en algunas máquinas (Cray, por ejemplo). Incluso los ‘tipos de ancho exacto’ comoint64_t
no son 100% portátiles; se definen solo si la arquitectura admite dicho tipo. losint_least64_t
Los tipos son lo más parecido a lo portátil.–Jonathan Leffler
Hace 8 horas
La especificación C11 es §7.21.6.1 El
fprintf
función — la entrada en §7.21.6.3 Elprintf
función en gran medida redirige a ¶7.21.6.1. La especificación POSIX esprintf()
.–Jonathan Leffler
Hace 8 horas
int
tampoco es portátil pero puede ser la mejor opción en algunos casos; por ejemplo, el índice de un pequeñofor
loop normalmente no requiere portabilidad. Por otra parte,long
no es portatil y nunca es útil y nunca es la mejor opción.long
es simplemente malo Si necesita algo garantizado para ser de 32 bits o 64 bits, entonces useuint32_t
ouint64_t
. Simple. Si no están disponibles en alguna plataforma exótica, su código no compilará lo que desea.– Marcha
hace 7 horas