#include <stdio.h>
int main() {
unsigned long long int num = 285212672; //FYI: fits in 29 bits
int normalInt = 5;
printf("My number is %d bytes wide and its value is %ul. A normal number is %d.\n", sizeof(num), num, normalInt);
return 0;
}
Resultado:
My number is 8 bytes wide and its value is 285212672l. A normal number is 0.
Presumo que esse resultado inesperado seja da impressão do unsigned long long int
. Como você printf()
um unsigned long long int
?
Respostas:
Use o modificador ll (el-el) long-long com a conversão u (não assinada). (Funciona em janelas, GNU).
fonte
long long
argumentos paraprintf
e usar o formato errado para um deles, digamos, em%d
vez de%lld
, mesmo os argumentos impressos após o incorreto podem estar completamente desligados (ou até causarprintf
uma falha) ) Essencialmente, argumentos variáveis são passados para printf sem nenhuma informação de tipo; portanto, se a sequência de formatação estiver incorreta, o resultado será imprevisível.Você pode querer tentar usar a biblioteca inttypes.h que lhe dá tipos, tais como
int32_t
,int64_t
,uint64_t
etc. Você pode então usar suas macros, tais como:Isso é "garantido" para não causar o mesmo problema que
long
,unsigned long long
etc, pois você não precisa adivinhar quantos bits existem em cada tipo de dados.fonte
PRId64
,PRId32
macros definidos?inttypes.h
PRIu64
ePRIu32
para números inteiros não assinados.inttypes.h
padrão? Não seriastdint.h
?leastX
efastX
(que podem realmente ser maiores que o indicado) são obrigatórios.%d
-> paraint
%u
-> paraunsigned int
%ld
-> paralong int
oulong
%lu
-> paraunsigned long int
oulong unsigned int
ouunsigned long
%lld
-> paralong long int
oulong long
%llu
-> paraunsigned long long int
ouunsigned long long
fonte
Por muito tempo (ou __int64) usando MSVS, você deve usar% I64d:
fonte
Isso ocorre porque% llu não funciona corretamente no Windows e% d não pode lidar com números inteiros de 64 bits. Eu sugiro usar o PRIu64 e você verá que também é portátil para Linux.
Tente isso:
Resultado
fonte
int64_t
em vez disso, pois pode haver algumas implementações com muito maior que maiorNo Linux é
%llu
e no Windows é%I64u
Embora eu tenha achado que não funciona no Windows 2000, parece haver um bug por lá!
fonte
unsigned long long
tipo de dados ser relativamente novo (na época, com o padrão C99), mas os compiladores C (incluindo MinGW / GCC) utilizando o antigo tempo de execução do Microsoft C, que suportava apenas a especificação C89. Eu só tenho acesso a documentos da API do Windows realmente antigos e razoavelmente recentes. Portanto, é difícil dizer exatamente quando oI64u
suporte foi recebido. Mas parece a era XP.Compile-o como x64 com o VS2005:
fonte
Além do que as pessoas escreveram anos atrás:
main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]
printf("%llu\n", k);
Então sua versão do mingw não é padronizada para c99. Adicionar esta bandeira compilador:
-std=c99
.fonte
Aparentemente, ninguém inventou uma solução multiplataforma * por mais de uma década desde [o] ano de 2008, então acrescentarei a minha 😛. Voto positivo. (Brincadeira. Eu não ligo.)
Solução:
lltoa()
Como usar:
Exemplo do OP:
Ao contrário da
%lld
string de formato de impressão, esta funciona para mim no GCC de 32 bits no Windows.*) Bem, quase multiplataforma. No MSVC, você aparentemente precisa em
_ui64toa()
vez delltoa()
.fonte
lltoa
.Coisas fora do padrão são sempre estranhas :)
para a longa porção longa sob GNU é
L
,ll
ouq
e sob as janelas eu acredito que é
ll
apenasfonte
Hex:
Resultado:
fonte
Bem, uma maneira é compilá-lo como x64 com o VS2008
Isso é executado conforme o esperado:
Para código de 32 bits, precisamos usar o especificador de formato __int64 correto% I64u. Assim se torna.
Esse código funciona para o compilador VS de 32 e 64 bits.
fonte