¿Cuál es el argumento para printf que formatea mucho?

Respuestas:

634

Ponga una l(letra minúscula L) directamente antes del especificador.

unsigned long n;
long m;

printf("%lu %ld", n, m);
postfuturista
fuente
14
printf("%ld", ULONG_MAX)genera el valor como -1. Debe ser printf("%lu", ULONG_MAX)por tiempo no firmado como se describe a continuación @Blorgbeard.
jammus
2
En realidad, deberías cambiarlo para %ldque sea más armónico con la pregunta OP.
Dr Beco
Sí, Dr. Beco; Además, solo se %ldisparawarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni
190

Creo que quieres decir:

unsigned long n;
printf("%lu", n);   // unsigned long

o

long n;
printf("%ld", n);   // signed long
Blorgbeard está fuera
fuente
73

En la mayoría de las plataformas, longy intson 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ás 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 imprimo valores de 64 bits, me resulta ú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 mainstream x64). "int" es el tamaño int predeterminado de la plataforma, generalmente 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!). "long long" 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 editando un código portátil de plataforma x. Incluso entonces, probablemente habrían usado una macro en su lugar 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ían 64 bits, pero no, eso habría causado problemas de portabilidad locos. Por supuesto, incluso esto es una simplificación de la verdad arcana y rica en historia. Ver wiki: entero

Dave Dopson
fuente
@MM Aclaré mi respuesta para evitar confusiones.
Dave Dopson el
44
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
AndresR
1
@AndresR: absolutamente, y es muy importante para las personas que realizan programación integrada (construí un módulo del núcleo para una alarma de humo una vez). Lástima esas pobres almas cuando intentan usar código que no fue escrito para portabilidad.
Dave Dopson
No estoy tan seguro de que "la mayoría de las plataformas tengan un longtamaño de 32" sea cierto. Por ejemplo, estoy en Oracle Linux x86_64 / amd64, y con nvccun longes de 8 bytes.
ragerdl
"Ah, y por supuesto, es diferente en Windows". ¿Existe una solución multiplataforma?
Aaron Franke
17

Depende, si se refiere a largo sin signo, el carácter de formato es "%lu". Si te refieres a firmado largo, el carácter de formato es "%ld".

krato
fuente
12

En caso de que desee imprimir unsigned long longcomo yo, use:

unsigned long long n;
printf("%llu", n);

Para todas las demás combinaciones, creo que usa la tabla del manual printf , tomando la etiqueta de la fila y luego la columna para el tipo que esté intentando imprimir (como hago con lo printf("%llu", n)anterior).

Dolan Antenucci
fuente
0

Creo que responder esta pregunta definitivamente requeriría conocer el nombre y la versión del compilador que está utilizando y la plataforma (tipo de CPU, sistema operativo, etc.) para la que está compilando.

Andrew O'Reilly
fuente
Su respuesta debe ser un comentario y no una respuesta en sí misma.
Jaime Hablutzel