Как отформатировать 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, там, кажется, есть ошибка!
нестандартные вещи всегда странно :)
для длинной длинной части
под GNU это L
, ll
или q
и под windows я считаю, что это ll
только
В дополнение к тому, что люди писали много лет назад:
- вы можете получить эту ошибку на 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 бит против компилятора.