Как вы форматируете unsigned long long int, используя printf? - PullRequest
329 голосов
/ 06 августа 2008
#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?

Ответы [ 12 ]

0 голосов
/ 22 марта 2019

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

Решение: 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().

0 голосов
/ 06 августа 2008

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

...