Вопрос

У меня есть некоторый код c (++), который использует sprintf для преобразования uint_64 в строку. Это должно быть переносимо на Linux и Solaris.

В Linux мы используем% ju, но в Solaris, похоже, нет никакого эквивалента. Самое близкое, что я могу найти, это% lu, но это дает неправильный вывод. Пример кода:

#include <stdio.h>
#include <sys/types.h>

#ifdef SunOS
typedef uint64_t u_int64_t;
#endif

int main(int argc, char **argv) {
    u_int64_t val = 123456789123L;

#ifdef SunOS
    printf("%lu\n", val);
#else
    printf("%ju\n", val);
#endif
}

В Linux вывод такой, как и ожидалось; в Solaris 9 (не спрашивайте), это «28»

Что я могу использовать?

Это было полезно?

Решение

Если у вас есть inttypes.h, вы можете использовать предоставляемые им макросы:

printf(  "%" PRIu64 "\n", val);

Не очень (кажется, я много говорил об этом в последнее время), но это работает.

Другие советы

В системе, совместимой с C99:

#include <inttypes.h>

uint64_t big = ...;
printf("%" PRIu64 "\n", big);

См. раздел 7.8 стандарта C99.

Спецификаторы: {PRI, SCN} [diouxX] {N, LEASTN, MAX, FASTN, PTR}

Где PRI для семейства printf (), SCN для семейства scanf (), d и i для целочисленных типов со знаком; o, u, x, X для целочисленных типов без знака как восьмеричное, десятичное, шестнадцатеричное и шестнадцатеричное; N - одна из поддерживаемых ширин; LEAST и FAST соответствуют этим модификаторам; PTR для intptr_t; и MAX для intmax_t.

Ответ зависит от того, является ли ваш код C или C ++. В C вы должны использовать long unsigned long long , а не другой тип (это соответствует текущему стандарту, и long long довольно распространено, поскольку поддержка C99 идет ), добавив ULL вместо L к вашей константе, и используя (как уже упоминалось) % llu в качестве вашего спецификатора. Если поддержка C99 не существует, вы можете проверить документацию компилятора, поскольку другого стандартного способа сделать это не существует. long long гарантированно должен быть не менее 64 бит.

Вы можете долго использовать % llu . Тем не менее, это тоже не очень переносимо, потому что long long не обязательно будет 64-битным. : -)

Вы можете получить uint64_t из stdint.h , если хотите избежать условного определения типа SunOS.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top