Как вы форматируете 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_tetc. Затем вы можете использовать его макросы, такие как:uint64_t x; uint32_t y; printf("x: %"PRId64", y: %"PRId32"\n", x, y);это "гарантировано", чтобы не дать вам те же проблемы, что и
long,unsigned long longи т. д., Так как вам не нужно угадывать, сколько бит в каждом типе данных.
%d--> наint
%u--> наunsigned int
%ld--> наlong int
%lu--> наunsigned long int
%lld--> на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 бит против компилятора.
Comments