printf + uint_64 на Solaris 9? - PullRequest
       30

printf + uint_64 на Solaris 9?

9 голосов
/ 03 октября 2008

У меня есть некоторый код 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»

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

Ответы [ 5 ]

11 голосов
/ 03 октября 2008

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

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

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

7 голосов
/ 03 октября 2008

В системе, совместимой с 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; и МАКС для intmax_t.

2 голосов
/ 03 октября 2008

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

0 голосов
/ 03 октября 2008

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

0 голосов
/ 03 октября 2008

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...