2008-10-03 5 views
9

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

В 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»

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

ответ

11

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

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

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

+0

Удивительный! Это сработало отлично. Благодаря! – 2008-10-03 00:32:42

0

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

0

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

+0

Но вам также нужен PRIu64 от , и который включает в себя . – 2008-10-03 01:59:18

+0

Хорошая точка, спасибо Jonathan :) – 2008-10-03 10:42:10

2

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

7

На совместимой системе C99:

#include <inttypes.h> 

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

можно найти в разделе 7.8 стандарта C99.

В спецификаторы {ПОИ, сюжетные} [diouxX] {N, LEASTN, MAX, FASTN, ПТР}

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

 Смежные вопросы

  • Нет связанных вопросов^_^