La printf
función toma un tipo de argumento, como %d
o %i
para a signed int
. Sin embargo, no veo nada por un long
valor.
La printf
función toma un tipo de argumento, como %d
o %i
para a signed int
. Sin embargo, no veo nada por un long
valor.
Respuestas:
Ponga una l
(letra minúscula L) directamente antes del especificador.
unsigned long n;
long m;
printf("%lu %ld", n, m);
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.
%ld
que sea más armónico con la pregunta OP.
%l
disparawarning: unknown conversion type character 0x20 in format [-Wformat]
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 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
long
tamaño de 32" sea cierto. Por ejemplo, estoy en Oracle Linux x86_64 / amd64, y con nvcc
un long
es de 8 bytes.
En caso de que desee imprimir unsigned long long
como 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).
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.