Используйте ll (el-el) длинно-длинный модификатор с u (неподписанное) преобразование. (Работы в окнах, GNU).
printf("%llu", 285212672);
Ну, один путь состоит в том, чтобы скомпилировать его как 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);
Этот код работает на оба компилятора VS на 32 и 64 бита.
Нестандартные вещи являются всегда странными:)
для долгой долгой части под GNU это L
, ll
или q
, и под окнами я полагаю, что это ll
[только 116]
Это вызвано тем, что %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.
Можно хотеть попытаться пользоваться 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
и т.д., так как Вы не должны предполагать, сколько битов находится в каждом типе данных.
В Linux это %llu
, и в Windows это %I64u
, Хотя я нашел, что это не работает в Windows 2000, там, кажется, существует ошибка!
Для long long (или __int64) с использованием MSVS вы должны использовать% I64d:
__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b); //I is capital i