Qual é o argumento para printf que formata um longo?

Respostas:

634

Coloque uma l(letra minúscula L) diretamente antes do especificador.

unsigned long n;
long m;

printf("%lu %ld", n, m);
pós-futebolista
fonte
14
printf("%ld", ULONG_MAX)gera o valor como -1. Deverá permanecer printf("%lu", ULONG_MAX)sem assinatura, conforme descrito por @Blorgbeard abaixo.
1113 Jam Jammus
2
Na verdade, você deve mudar %ldpara ser mais harmônico com a questão do OP.
Dr Beco
Sim Dr. Beco; Além disso, apenas %lgatilhoswarning: unknown conversion type character 0x20 in format [-Wformat]
Patrizio Bertoni
190

Eu acho que você quer dizer:

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

ou

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

Na maioria das plataformas, longe intsã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

Dave Dopson
fonte
Esclareci minha resposta para evitar confusão.
precisa
4
Apenas para esclarecer: existem mais arquiteturas que x86 e x64 e, nessas arquiteturas, char, short, int, long e long long têm significados diferentes. Por exemplo, um mcu de 32 bits com alinhamento de memória de 16 bits pode usar: char = short = int = 16 bits; longo = 32 bits; long long = 64 bits
AndresR 6/16
1
@AndresR - absolutamente, e isso importa muito profundamente para as pessoas que fazem programação incorporada (eu construí um módulo do kernel para um alarme de fumaça uma vez). Tenha pena dessas pobres almas quando elas tentam usar código que não foi escrito para portabilidade.
Dave Dopson
Não tenho tanta certeza de que "a maioria das plataformas tem longtamanho 32" ainda é verdade. Por exemplo, eu estou no Oracle Linux x86_64 / amd64, e com nvccuma longé de 8 bytes.
ragerdl
"Ah, e claro, é diferente no Windows". Existe uma solução de plataforma cruzada?
Aaron Franke
17

Depende, se você estiver se referindo a não assinado por muito tempo, o caractere de formatação é "%lu". Se você está se referindo a assinados por muito tempo, o caractere de formatação é "%ld".

krato
fonte
12

Caso você queira imprimir unsigned long longcomo 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).

Dolan Antenucci
fonte
0

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.

Andrew O'Reilly
fonte
Sua resposta deve ser um comentário e não uma resposta por si só.
Jaime Hablutzel 29/08/19