Eu nunca consigo entender como imprimir o unsigned long
tipo 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 -123123123
número em vez do unsigned long
que eu tenho.
c
printf
long-integer
unsigned
format-specifiers
bodacydo
fonte
fonte
%lu
dessa vez funcionou. Obrigado. Algo mais deve ter acontecido antes e não funcionou.%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 ...%lu
, dividido em:%
- inicia uma "especificação de conversão";l
- o modificador de comprimento,l
significa "[sem sinal] long int";u
- o especificador de conversão,u
é para que umunsigned int
seja impresso como decimal. Como fornecemos o modificador de comprimentol
, ele aceita umunsigned 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!)%lu
por muito tempo não assinado%llu
por muito tempo não assinadofonte
Para int
%d
Por muito tempo int
%ld
Por muito tempo int
%lld
Para long long int sem sinal
%llu
fonte
De todas as combinações que você tentou,
%ld
e%lu
são as únicas que são especificadoras válidas do formato printf.%lu
(decimal longo sem sinal)%lx
ou%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 ol
).fonte
printf
é especificado para exigir os tipos de argumento corretos exatos sem as permissões queva_arg
teriam.Isso será útil. . .
fonte
O formato é
%lu
.Verifique os vários outros tipos de dados e seu uso em printf aqui
fonte
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.
fonte
Eu tive o mesmo problema. Tente "% ul", funciona para mim.
fonte