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.

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?


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


28

Para int %d

Por muito tempo int %ld

Por muito tempo int %lld

Para long long int sem sinal %llu


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).


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. . .



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.


-5

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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.