¿Cuál es el argumento a favor de printf que da formato largo?
-
09-06-2019 - |
Pregunta
El printf
La función toma un tipo de argumento, como %d
o %i
para signed int
.Sin embargo, no veo nada por un long
valor.
Solución
Poner un l
(letra L minúscula) directamente antes del especificador.
unsigned long n;
long m;
printf("%lu %ld", n, m);
Otros consejos
Creo que quieres decir:
unsigned long n;
printf("%lu", n); // unsigned long
o
long n;
printf("%ld", n); // signed long
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á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 mucho (en x64 convencional)."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 en plataformas integradas modernas!)."largo, largo" es un número de 64 bits y, por lo general, lo que la gente quería usar a menos que realmente supieran lo que estaban haciendo editando un fragmento de código portátil de 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 increíbles problemas de portabilidad.Por supuesto, incluso esto es una simplificación de la verdad arcana y rica en historia.Ver wiki: entero
Depende, si te refieres a un carácter largo sin firmar, el carácter de formato es "%lu"
.Si te refieres a firmado largo, el carácter de formato es "%ld"
.
En caso de que estés buscando imprimir unsigned long long
como estaba yo, uso:
unsigned long long n;
printf("%llu", n);
Para todas las demás combinaciones, creo que usas la tabla de el manual impreso, tomando la fila, luego la etiqueta de la columna para cualquier tipo que esté intentando imprimir (como hago yo con printf("%llu", n)
arriba).
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 está compilando.