Pergunta

#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 inesperado resultado é a impressão de que o unsigned long long int.Como você printf() um unsigned long long int?

Foi útil?

Solução

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

printf("%llu", 285212672);

Outras dicas

Você pode querer tentar usar a inttypes.h biblioteca que lhe dá tipos, tais como int32_t, int64_t, uint64_t etc.Em seguida, você pode usar suas macros, tais como:

uint64_t x;
uint32_t y;

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

Este é "garantido" para não lhe dar o mesmo problema como long, unsigned long long etc, desde que você não tem que adivinhar quantos bits são em cada tipo de dados.

%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

Para 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

Isso é porque %oll não funciona corretamente no Windows e %d não pode manipular números inteiros de 64 bits.Eu sugiro usar o PRIu64 e você vai descobrir que é portátil para o Linux.

Tente isso:

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

No Linux é %llu e no Windows é %I64u

Apesar de eu ter encontrado ele não funciona no Windows 2000, não parece ser um bug lá!

Compilar como x64 com VS2005:

%oll funciona bem.

Não-padrão as coisas são sempre estranho :)

para a longa porção sob o GNU é L, ll ou q

e no windows eu acredito que é ll apenas

Hex:

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

Saída:

64bit: FFFFFFFFFFFFFFFF

Além do que as pessoas escreveram anos atrás:

  • 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 c99.Adicionar este sinalizador de compilador: -std=c99.

Bem, é uma maneira de compilar como x64 com o VS2008

Este é executado 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 a versão de 32 bits de código, precisamos usar o correto __int64 especificador de formato %I64u.Torna-se assim.

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 para ambos os 32 e 64 bits VS compilador.

Aparentemente, ninguém chegou com um multi-plataforma* solução para mais de uma década desde o ano de 2008, portanto, vou acrescentar minas 😛.Plz vote positivamente.(Brincando.Eu não me importo.)

Solução: lltoa()

Como usar:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

OP exemplo:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

Ao contrário da %lld impressão de caracteres de formato, isso funciona para mim em 32 bits do GCC no Windows.

*) Bem, quase multi-plataforma.No MSVC, aparentemente você precisa _ui64toa() em vez de lltoa().

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top