Как Вы форматируете неподписанное долгое длинное целое с помощью printf?

356
задан trentcl 13 September 2018 в 16:32
поделиться

7 ответов

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

printf("%llu", 285212672);
458
ответ дан rogerdpack 23 November 2019 в 00:21
поделиться

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

Этот код работает на оба компилятора VS на 32 и 64 бита.

0
ответ дан vzczc 23 November 2019 в 00:21
поделиться

Нестандартные вещи являются всегда странными:)

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

, и под окнами я полагаю, что это ll [только 116]

4
ответ дан sparkes 23 November 2019 в 00:21
поделиться

Это вызвано тем, что %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.
36
ответ дан tofutim 23 November 2019 в 00:21
поделиться

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

85
ответ дан Nathan Fellman 23 November 2019 в 00:21
поделиться

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

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

12
ответ дан ST3 23 November 2019 в 00:21
поделиться

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

__int64 a;
time_t b;
...
fprintf(outFile,"%I64d,%I64d\n",a,b);    //I is capital i
38
ответ дан 23 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: