Как вы PRINTF неподписанный долго долго Int (формат спецификатор для неподписанного долгого долгого INT)?

голоса
286
#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?

Задан 05/08/2008 в 21:59
источник пользователем
На других языках...                            


11 ответов

голоса
380

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

printf("%llu", 285212672);
Ответил 05/08/2008 d 22:02
источник пользователем

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

Ответил 12/08/2008 d 12:07
источник пользователем

голоса
34

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

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Ответил 06/09/2009 d 15:26
источник пользователем

голоса
30

%d-> для int

%u-> для unsigned int

%ld-> для long int

%lu-> для unsigned long int

%lld-> для long long int

%llu-> для unsigned long long int

Ответил 13/05/2015 d 17:48
источник пользователем

голоса
29

Это потому, что% ЛСУ не работает должным образом под 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.
Ответил 09/09/2008 d 08:54
источник пользователем

голоса
9

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

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

Ответил 11/09/2008 d 01:57
источник пользователем

голоса
8

Компиляция как x64 с VS2005:

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

Ответил 11/10/2012 d 07:23
источник пользователем

голоса
4

Hex:

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

Вывод:

64bit: FFFFFFFFFFFFFFFF
Ответил 26/07/2015 d 09:57
источник пользователем

голоса
4

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

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

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

Ответил 05/08/2008 d 22:03
источник пользователем

голоса
2

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

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

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

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

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

Ответил 17/01/2016 d 12:27
источник пользователем

голоса
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 компилятора.

Ответил 05/08/2008 d 22:40
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more