Como imprimir "sem assinatura" em C?

342

Eu nunca consigo entender como imprimir o unsigned longtipo de dados em C.

Suponha que unsigned_fooé um unsigned long, então eu tento:

  • printf("%lu\n", unsigned_foo)
  • printf("%du\n", unsigned_foo)
  • printf("%ud\n", unsigned_foo)
  • printf("%ll\n", unsigned_foo)
  • printf("%ld\n", unsigned_foo)
  • printf("%dl\n", unsigned_foo)

E todos eles imprimem algum tipo de -123123123número em vez do unsigned longque eu tenho.

bodacydo
fonte

Respostas:

499

%lué o formato correto para unsigned long. Parece que existem outros problemas em jogo aqui, como corrupção de memória ou uma variável não inicializada. Talvez nos mostre uma imagem maior?

Thanatos
fonte
12
Opa, %ludessa vez funcionou. Obrigado. Algo mais deve ter acontecido antes e não funcionou.
bodacydo
11
@bodacydo: Se você tem um bug, ele pode aparecer de maneira semi-aleatória ... verifique se sua variável possui um valor válido antes de tentar imprimi-lo.
Thanatos
11
Mesmo que a variável não seja inicializada, não deve haver como o printf atingir um ponto em que possa imprimir um sinal de menos quando o especificador de formato estava %lu. Tecnicamente, é um comportamento indefinido, mas, na realidade, a variável tem um valor imprevisível que é passado para printf, que printf interpreta como não assinado. Eu estou supondo problema original do bodacydo foi fluir atingindo uma chamada printf incorreta em vez do pretendido ...
R .. GitHub Stop Ice AJUDAR
8
@ Anisha Kaul:% lu é uma especificação de conversão válida,% ul não é. %lu, dividido em: %- inicia uma "especificação de conversão"; l- o modificador de comprimento, lsignifica "[sem sinal] long int"; u- o especificador de conversão, ué para que um unsigned intseja impresso como decimal. Como fornecemos o modificador de comprimento l, ele aceita um unsigned long int. As letras devem estar nessa ordem: porcentagem, comprimento, conversão. (Existem mais algumas opções, como largura e precisão, que você pode adicionar. Veja a página man , como ele documenta tudo isto precisamente!)
Thanatos
11
% ul será impresso sem sinal (com% u) e, em seguida, a letra "l" literalmente. Assim como "% uw" será impresso sem sinal, seguido pela letra "w". % inicia o convspec, u (ou algum outro caractere, como d, s, c ...) termina.
Veky
30
  • %lupor muito tempo não assinado
  • %llupor muito tempo não assinado
NealCaffery
fonte
13
Convenção Yoda: "não assinado por muito tempo" "(l) ong (u) nsigned" é.
amigos estão dizendo sobre reb
28

Para int %d

Por muito tempo int %ld

Por muito tempo int %lld

Para long long int sem sinal %llu

Linkon
fonte
23

De todas as combinações que você tentou, %lde %lusão as únicas que são especificadoras válidas do formato printf. %lu(decimal longo sem sinal) %lxou %lX(hexadecimal longo com letras minúsculas ou maiúsculas) e %lo(octal longo) são os únicos especificadores de formato válidos para uma variável do tipo sem sinal longo (é claro que você pode adicionar largura de campo, precisão, etc. %e o l).

R .. GitHub PARE DE AJUDAR O GELO
fonte
11
O% ld funcionará bem até o valor de std :: numeric_limits <longitudinalmente assinado> :: max () / 2. Acima disso,% ld imprimirá um valor incorreto (valor negativo).
Kaushik Acharya
11
@KaushikAcharya: Não, acima disso, é UB. E é indiscutivelmente até UB antes disso, pois printfé especificado para exigir os tipos de argumento corretos exatos sem as permissões que va_argteriam.
R .. GitHub Pare de ajudar o gelo
9
int main()
{
    unsigned long long d;
    scanf("%llu",&d);
    printf("%llu",d);
    getch();
}

Isso será útil. . .

Sanjith Bravo Dastan
fonte
9

O formato é %lu.

Verifique os vários outros tipos de dados e seu uso em printf aqui

Praveen S
fonte
2
Vários comportamentos fora do padrão são documentados lá sem marcá-los como fora do padrão. O POSIX é o padrão on-line mais fácil de acessar para printf; extensões para além ISO C são marcadas com a "CX" tag: opengroup.org/onlinepubs/9699919799/functions/fprintf.html
R .. GitHub parar de ajudar ICE
8

O especificador correto por muito tempo não assinado é %lu.

Se você não estiver obtendo o valor exato esperado, pode haver alguns problemas no seu código.

Copie seu código aqui. Então talvez alguém possa lhe dizer melhor qual é o problema.

Kumar Alok
fonte
-5

Eu tive o mesmo problema. Tente "% ul", funciona para mim.

Joseleo
fonte
6
Esta pergunta foi amplamente respondida há mais de 8 anos. Certifique-se de que uma nova resposta adicione novas informações e, mais importante, esteja correta.
Gerhardh 11/11