Как отформатировать unsigned long long int с помощью printf?

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

выход:

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

Я полагаю, что этот неожиданный результат от печати unsigned long long int. Как вы printf() an unsigned long long int?

11 ответов


используйте модификатор ll (el-el) long-long с преобразованием u (без знака). (Работает в windows, GNU).

printf("%llu", 285212672);

вы можете попробовать использовать inttypes.ч библиотека, которая дает вам такие типы, как int32_t, int64_t, uint64_t etc. Затем вы можете использовать его макросы, такие как:

uint64_t x;
uint32_t y;

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

это "гарантировано", чтобы не дать вам такие же неприятности, как long, unsigned long long etc, так как вам не нужно угадывать, сколько битов в каждом типе данных.


%d--> for int

%u--> на unsigned int

%ld--> на long int

%lu--> на unsigned long int

%lld--> for long long int

%llu--> на unsigned long long int


для long long (или __int64) с помощью MSVS вы должны использовать %I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i

это потому, что %llu не работает должным образом под Windows, а %d не может обрабатывать 64-битные целые числа. Я предлагаю использовать PRIu64 вместо этого, и вы обнаружите, что он также переносим в Linux.

попробуйте это вместо этого:

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

выход

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

в Linux %llu и в Windows это %I64u

хотя я обнаружил, что не работает в Windows 2000, там, кажется, есть ошибка!


скомпилируйте его как x64 с VS2005:

%llu работает хорошо.


нестандартные вещи всегда странно :)

для длинной длинной части под GNU это L, ll или q

и под windows я считаю, что это ll только


Hex:

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

выход:

64bit: FFFFFFFFFFFFFFFF

В дополнение к тому, что люди писали много лет назад:

  • вы можете получить эту ошибку на gcc / mingw:

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

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

тогда ваша версия mingw не имеет значения по умолчанию c99. Добавьте этот флаг компилятора:-std=c99.


Ну, один из способов-скомпилировать его как x64 с VS2008

это работает, как вы ожидаете:

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

для 32-битного кода нам нужно использовать правильный спецификатор формата _ _ int64 %I64u. Так оно и становится.

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

этот код работает как для 32, так и для 64 бит против компилятора.