Как вы форматируете unsigned long long int, используя printf?

c syntax printf format-specifiers long-long

677236 просмотра

12 ответа

#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?

Автор: andrewrk Источник Размещён: 17.05.2019 02:41

Ответы (12)


409 плюса

Решение

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

printf("%llu", 285212672);
Автор: John Downey Размещён: 05.08.2008 09:02

80 плюса

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

Автор: Nathan Fellman Размещён: 12.08.2008 11:07

49 плюса

%d-> для int

%u-> для unsigned int

%ld-> для long int

%lu-> для unsigned long int

%lld-> для long long int

%llu-> для unsigned long long int

Автор: Shivam Chauhan Размещён: 13.05.2015 05:48

36 плюса

Для длительного (или __int64) использования MSVS вы должны использовать% I64d:

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
Автор: Steven Размещён: 06.09.2009 02:26

32 плюса

Это связано с тем, что% 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.
Автор: Paul Hargreaves Размещён: 09.09.2008 07:54

12 плюса

В Linux это есть, %lluа в Windows это%I64u

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

Автор: Adam Pierce Размещён: 11.09.2008 12:57

8 плюса

Скомпилируйте его как x64 с VS2005:

% llu работает хорошо.

Автор: Sandy Размещён: 11.10.2012 06:23

4 плюса

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

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

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

Автор: sparkes Размещён: 05.08.2008 09:03

4 плюса

Hex:

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

Выход:

64bit: FFFFFFFFFFFFFFFF
Автор: lama12345 Размещён: 26.07.2015 09:57

2 плюса

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

  • Вы можете получить эту ошибку в gcc / mingw:

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

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

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

Автор: Bernd Elkemann Размещён: 17.01.2016 12:27

0 плюса

Ну, один из способов это скомпилировать как 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.

Автор: vzczc Размещён: 05.08.2008 09:40

0 плюса

По-видимому, никто не придумал мультиплатформенное * решение в течение более десяти лет с [2008 года], поэтому я добавлю свое 😛. Плз upvote. (Шучу. Мне все равно.)

В двух словах:

#include <stdlib.h> /* lltoa() */
// ...
char dummy[255];
printf("Over 4 bytes: %s\n", lltoa(5555555555, dummy, 10));
printf("Another one: %s\n", lltoa(15555555555, dummy, 10));

Пример ОП:

#include <stdio.h>
#include <stdlib.h> /* lltoa() */

int main() {
    unsigned long long int num = 285212672; // fits in 29 bits
    char dummy[255];
    int normalInt = 5;
    printf("My number is %d bytes wide and its value is %s. "
        "A normal number is %d.\n", 
        sizeof(num), lltoa(num, dummy, 10), normalInt);
    return 0;
}

В отличие от %lldстроки формата печати, эта работает для меня в GCC на Windows.

*) Ну почти мультиплатформенный. В MSVC вам, видимо, нужно _ui64toaвместо lltoa.

Автор: 7vujy0f0hy Размещён: 22.03.2019 07:08
Вопросы из категории :
32x32