Como você printf um int long long sem sinal (o especificador de formato para unsigned int long long)?

votos
286
#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;
}

Saída:

My number is 8 bytes wide and its value is 285212672l. A normal number is 0.

Eu suponho que este resultado inesperado é de imprimir o unsigned long long int. Como você printf()um unsigned long long int?

Publicado 05/08/2008 em 21:59
fonte usuário
Em outras línguas...                            


11 respostas

votos
380

Use o ll (el-el) longa longo modificador com a conversão u (não assinado). (Funciona no Windows, GNU).

printf("%llu", 285212672);
Respondeu 05/08/2008 em 22:02
fonte usuário

votos
71

Você pode querer tentar usar a biblioteca inttypes.h que lhe dá tipos, tais como int32_t, int64_t, uint64_tetc. Você pode então usar suas macros, tais como:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Isto é "garantido" para não dar-lhe o mesmo problema que long, unsigned long longetc, desde que você não tem que adivinhar quantos bits estão em cada tipo de dados.

Respondeu 12/08/2008 em 12:07
fonte usuário

votos
34

Por muito tempo longo (ou __int64) usando MSVS, você deve usar% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Respondeu 06/09/2009 em 15:26
fonte usuário

votos
30

%d-> para int

%u-> para unsigned int

%ld-> para long int

%lu-> para unsigned long int

%lld-> para long long int

%llu-> para unsigned long long int

Respondeu 13/05/2015 em 17:48
fonte usuário

votos
29

Isso é porque% OLL não funciona corretamente no Windows e% d não pode lidar com 64 bits inteiros. Eu sugiro usar PRIu64 vez e você vai descobrir que é portátil para Linux também.

Tente isto em vez disso:

#include <stdio.h>
#include <inttypes.h>

int main() {
    unsigned long long int num = 285212672; //FYI: fits in 29 bits
    int normalInt = 5;
    /* NOTE: PRIu64 is a preprocessor macro and thus should go outside the quoted string. */
    printf("My number is %d bytes wide and its value is %"PRIu64". A normal number is %d.\n", sizeof(num), num, normalInt);
    return 0;
}

Saída

My number is 8 bytes wide and its value is 285212672. A normal number is 5.
Respondeu 09/09/2008 em 08:54
fonte usuário

votos
9

No Linux é %llue no Windows é%I64u

Embora eu descobri que não funciona no Windows 2000, não parece ser um bug lá!

Respondeu 11/09/2008 em 01:57
fonte usuário

votos
8

Compilá-lo como x64 com VS2005:

% OLL funciona bem.

Respondeu 11/10/2012 em 07:23
fonte usuário

votos
4

hex:

printf("64bit: %llp", 0xffffffffffffffff);

Saída:

64bit: FFFFFFFFFFFFFFFF
Respondeu 26/07/2015 em 09:57
fonte usuário

votos
4

coisas fora do padrão são sempre estranho :)

para a longa longa porção sob GNU é L, llouq

e sob janelas Eu acredito que é llúnica

Respondeu 05/08/2008 em 22:03
fonte usuário

votos
2

Além de que as pessoas escreveu anos atrás:

  • que você pode obter este erro no gcc / mingw:

main.c:30:3: warning: unknown conversion type character 'l' in format [-Wformat=]

printf("%llu\n", k);

Em seguida, a sua versão do mingw não padrão para c99. Adicionar esta bandeira compilador: -std=c99.

Respondeu 17/01/2016 em 12:27
fonte usuário

votos
1

Bem, é uma maneira de compilá-lo como x64 com VS2008

Isto funciona como seria de esperar:

int normalInt = 5; 
unsigned long long int num=285212672;
printf(
    "My number is %d bytes wide and its value is %ul. 
    A normal number is %d \n", 
    sizeof(num), 
    num, 
    normalInt);

Para código de 32 bits, precisamos usar o formato __int64 especificador% I64u correta. Assim torna-se.

int normalInt = 5; 
unsigned __int64 num=285212672;
printf(
    "My number is %d bytes wide and its value is %I64u. 
    A normal number is %d", 
    sizeof(num),
    num, normalInt);

Esse código funciona tanto para 32 e 64 bits VS compilador.

Respondeu 05/08/2008 em 22:40
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more