A printf
função aceita um tipo de argumento, como %d
ou %i
para a signed int
. No entanto, não vejo nada por um long
valor.
A printf
função aceita um tipo de argumento, como %d
ou %i
para a signed int
. No entanto, não vejo nada por um long
valor.
Respostas:
Coloque uma l
(letra minúscula L) diretamente antes do especificador.
unsigned long n;
long m;
printf("%lu %ld", n, m);
printf("%ld", ULONG_MAX)
gera o valor como -1. Deverá permanecer printf("%lu", ULONG_MAX)
sem assinatura, conforme descrito por @Blorgbeard abaixo.
%ld
para ser mais harmônico com a questão do OP.
%l
gatilhoswarning: unknown conversion type character 0x20 in format [-Wformat]
Eu acho que você quer dizer:
unsigned long n;
printf("%lu", n); // unsigned long
ou
long n;
printf("%ld", n); // signed long
Na maioria das plataformas, long
e int
são do mesmo tamanho (32 bits). Ainda assim, ele possui seu próprio especificador de formato:
long n;
unsigned long un;
printf("%ld", n); // signed
printf("%lu", un); // unsigned
Para 64 bits, você deseja long long
:
long long n;
unsigned long long un;
printf("%lld", n); // signed
printf("%llu", un); // unsigned
Ah, e claro, é diferente no Windows:
printf("%l64d", n); // signed
printf("%l64u", un); // unsigned
Freqüentemente, quando estou imprimindo valores de 64 bits, acho útil imprimi-los em hexadecimal (geralmente com números tão grandes, que são ponteiros ou 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"
irá imprimir:
0x00000000DEADBEEF
Btw, "long" não significa muito mais (no x64 convencional). "int" é o tamanho padrão da plataforma, normalmente 32 bits. "long" é geralmente do mesmo tamanho. No entanto, eles têm diferentes semânticas de portabilidade em plataformas mais antigas (e modernas plataformas incorporadas!). "long long" é um número de 64 bits e geralmente o que as pessoas pretendiam usar, a menos que realmente soubessem o que estavam fazendo editando um pedaço de código portátil da plataforma x. Mesmo assim, eles provavelmente usariam uma macro para capturar o significado semântico do tipo (por exemplo, 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
Voltar no dia, "int" era de 16 bits. Você pensaria que agora seriam 64 bits, mas não, isso teria causado problemas insanos de portabilidade. Obviamente, mesmo isso é uma simplificação da verdade arcana e rica em história. Veja wiki: Inteiro
long
tamanho 32" ainda é verdade. Por exemplo, eu estou no Oracle Linux x86_64 / amd64, e com nvcc
uma long
é de 8 bytes.
%ld
veja a printf
referência em cplusplus.com
Caso você queira imprimir unsigned long long
como eu, use:
unsigned long long n;
printf("%llu", n);
Para todas as outras combinações, acredito que você use a tabela do manual printf , pegando a linha e o rótulo da coluna para qualquer tipo que esteja tentando imprimir (como eu faço printf("%llu", n)
acima).
Acho que responder definitivamente a essa pergunta exigiria saber o nome e a versão do compilador que você está usando e a plataforma (tipo de CPU, sistema operacional etc.) para a qual está compilando.