lenguaje - ¿Cuál es el argumento para printf que formatea un largo?
printf y scanf en dev c++ (7)
La función printf
toma un tipo de argumento, como %d
o %i
para un signed int
. Sin embargo, no veo nada por un valor long
.
Coloque una l
(letra minúscula L) directamente delante del especificador.
unsigned long n;
long m;
printf("%lu %ld", n, m);
Creo que quieres decir:
unsigned long n;
printf("%lu", n); // unsigned long
o
long n;
printf("%ld", n); // signed long
Creo que responder a esta pregunta definitivamente requeriría conocer el nombre y la versión del compilador que está utilizando y la plataforma (tipo de CPU, SO, etc.) para la que se está compilando.
Depende, si se está refiriendo a sin signo durante mucho tiempo, el carácter de formato es "%lu"
. Si está refiriéndose a firmado durante mucho tiempo el carácter de formato es "%ld"
.
En caso de que quiera imprimir unsigned long long
como lo estaba, use:
unsigned long long n;
printf("%llu", n);
Para todas las demás combinaciones, creo que usa la tabla del manual de printf , tomando la fila, luego la etiqueta de columna para el tipo que esté intentando imprimir (como hago con printf("%llu", n)
arriba).
En la mayoría de las plataformas, long
e 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 estoy imprimiendo 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 la corriente principal x64). "int" es el tamaño int predeterminado de la plataforma, normalmente de 32 bits. "largo" suele ser del mismo tamaño. Sin embargo, tienen diferentes semánticas de portabilidad en plataformas más antiguas (¡y plataformas integradas modernas!). "long long" es un número de 64 bits y generalmente lo que la gente quería usar a menos que realmente supiera lo que estaban haciendo editando un trozo 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 día, "int" era de 16 bits. Usted pensaría que ahora serían 64 bits, pero no, eso habría causado problemas de portabilidad insanos. Por supuesto, incluso esta es una simplificación de la verdad arcana y rica en historia. Ver wiki:Integer
%ld
vea la referencia de printf
en cplusplus.com