Как вы форматируете unsigned long long int, используя printf? - PullRequest
329 голосов
/ 06 августа 2008
#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() unsigned long long int?

Ответы [ 12 ]

427 голосов
/ 06 августа 2008

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

printf("%llu", 285212672);
83 голосов
/ 12 августа 2008

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

uint64_t x;
uint32_t y;

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

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

55 голосов
/ 13 мая 2015

%d -> для int

%u -> для unsigned int

%ld -> для long int

%lu -> для unsigned long int

%lld -> для long long int

%llu -> для unsigned long long int

37 голосов
/ 06 сентября 2009

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

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
35 голосов
/ 09 сентября 2008

Это потому, что% 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.
12 голосов
/ 11 сентября 2008

В Linux это %llu, а в Windows %I64u

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

8 голосов
/ 11 октября 2012

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

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

4 голосов
/ 26 июля 2015

Hex:

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

Выход:

64bit: FFFFFFFFFFFFFFFF
4 голосов
/ 06 августа 2008

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

для длинной длинной порции под GNU это L, ll или q

и под окнами я считаю, что ll только

2 голосов
/ 17 января 2016

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

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

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

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

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

...