2008-08-05 3 views
281
#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; 
} 

Выход:Как вы печатаете unsigned long long int (спецификатор формата для unsigned long long int)?

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

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

+1

См. Также http://stackoverflow.com/questions/5140871/sprintf-for-unsigned-int64 – hippietrail 2011-04-03 09:51:50

+0

Я бы предложил использовать с использованием stdint.h и быть явным количеством битов в вашей переменной. Мы все еще находимся в переходном периоде между 32 и 64-битными архитектурами, а «unsigned long long int» не означает одно и то же. – 2011-05-13 22:19:57

+1

Я просто скомпилировал ваш код (с% llu) с помощью gcc, и результат был правильным. Вы передаете какие-либо параметры компилятору? – Juan 2008-08-07 23:13:28

ответ

371

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

printf("%llu", 285212672); 
+14

Не работает в Windows - это только для Linux/UNIX. – 2008-09-09 18:17:19

+6

А если быть точным, это для GNU libc, и он не работает со средой выполнения Microsoft C. – 2008-10-08 09:35:02

+133

Это не дело Linux/UNIX, модификатор длины «ll» был добавлен в стандарт C на C99, если он не работает в «Microsoft C», то это потому, что они не соответствуют стандартам. – 2008-10-17 04:46:31

4

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

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

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

1

Ну, один из способов заключается в том, чтобы скомпилировать его как 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-битного VS-компилятора.

71

Вы можете попробовать использовать 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 и т. д., так как вам не нужно угадывать, сколько бит находится в каждом типе данных.

29

Это потому, что% 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. 
8

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

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

33

Долгих долго (или __int64) с помощью МСВСА, вы должны использовать% I64d:

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

скомпилировать как x64 с VS2005:

% ЛС работает хорошо.

26

%d -> для int

%ld -> для long int

%lld -> для long long int

%llu -> для unsigned long long int

4

Hex:

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

Выход:

64bit: FFFFFFFFFFFFFFFF 
2

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

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

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

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

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

Смежные вопросы