Сведения о вопросе

CPdeveloper

16:03, 1st July, 2020

Теги

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

Просмотров: 497   Ответов: 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() an unsigned long long int ?



  Сведения об ответе

padenie

18:03, 1st July, 2020

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

printf("%llu", 285212672);


  Сведения об ответе

FAriza

18:03, 1st July, 2020

Вы можете попробовать использовать библиотеку inttypes.h, которая предоставляет вам такие типы, как int32_t , int64_t, uint64_t и т.д. Затем вы можете использовать его macros, например:

uint64_t x;
uint32_t y;

printf("x: %"PRId64", y: %"PRId32"\n", x, y);

Это "guaranteed", чтобы не доставлять вам таких же проблем , как long, unsigned long long и т. д., Поскольку вам не нужно угадывать, сколько битов находится в каждом типе данных.


  Сведения об ответе

screen

18:03, 1st July, 2020

%d --> для int

%u --> для unsigned int

%ld --> для long int

%lu --> для unsigned long int

%lld --> для long long int

%llu --> для unsigned long long int


  Сведения об ответе

lesha

18:03, 1st July, 2020

Для long long (или __int64) с использованием MSVS следует использовать %I64d:

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


  Сведения об ответе

SKY

18:03, 1st July, 2020

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


  Сведения об ответе

baggs

18:03, 1st July, 2020

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

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


  Сведения об ответе

Chhiki

18:03, 1st July, 2020

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

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


  Сведения об ответе

#hash

18:03, 1st July, 2020

Нестандартные вещи всегда кажутся странными :)

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

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


  Сведения об ответе

ASSembler

18:03, 1st July, 2020

Hex:

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

Выход:

64bit: FFFFFFFFFFFFFFFF


  Сведения об ответе

KOMP

18:03, 1st July, 2020

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

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

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

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

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


  Сведения об ответе

ASSembler

18:03, 1st July, 2020

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


  Сведения об ответе

lesha

18:03, 1st July, 2020

По-видимому, никто не придумал решение multi-platform* уже более десяти лет, начиная с 2008 года, поэтому я добавлю свое . Плз, голосуйте. (Шутка. Мне все равно.)

Решение: lltoa()

Как пользоваться:

#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));

Пример OP х :

#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 , эта строка работает для меня под 32-битным GCC на Windows.

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


Ответить на вопрос

Чтобы ответить на вопрос вам нужно войти в систему или зарегистрироваться