uint64_t и работа с ним.

Тема в разделе "LANGS.C", создана пользователем Mika0x65, 8 апр 2009.

  1. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Мое почтение всем.

    Нужно вывести 64битное число на любой платформе.

    Немного подробностей. Есть куски памяти по 8 байт. Их надо уметь показать пользователю как знаковое и беззнаковое в различных системах исчисления. При этом хочется поддержать как можно больше компиляторов (Win*/*nix). MS VS не поддерживает С99 (исходник написан на С, не на С++), значит надо придерживаться С89.

    С другой стороны я все равно использую типы с четкими размерами (uint8_t, uint32_t, etc), их поддержка притащена с файлом pstdint.h от Paul Hsieh.

    Вывод меньших (8/16/32) типов я сделал с помощью своей простенькой itoa, заточенной под мои нужды. Перед вызовом ф-ии я привожу операнд к размеру 32_t и указываю наличие знака:
    Код (Text):
    1. int itoa(uint32_t num, int is_signed, int radix)
    2. {
    3.         int div;
    4.         int dig;
    5.         int res;
    6.  
    7.         res = 0;
    8.         div = 1;
    9.  
    10.         if (is_signed)
    11.         {
    12.                 if (num & 0x80000000)
    13.                 {
    14.                         di_copy_byte('-');
    15.                         num = ~num;
    16.                         num++;
    17.                 }
    18.         }
    19.  
    20.         while(num / div > radix)
    21.                 div *= radix;
    22.         while(div)
    23.         {
    24.                 dig = (num / div) % radix;
    25.                 if (dig > 10)
    26.                         dig += 'A' - 10;
    27.                 else
    28.                         dig += '0';
    29.                 di_copy_byte(dig);
    30.                 res++;
    31.                 div /= radix;
    32.         }
    33.  
    34.         return res;
    35. }
    64битный тип до этого поддерживался структурой QWORD с двумя 32_t членами. Однако, писать itoa для структуры мне пока не хочется -- придется писать операции умножения и деления. Т.к. задача вывода довольно-таки промежуточная и, подозреваю, вообще не будет использоваться, не хочется разводить много кода вокруг нее.

    Теперь, собственно, вопрос: если я просто использую тип uint64_t, могут ли у меня возникнуть проблемы с кросс-платформенностью? Т.е. мне нужно, чтобы исходник компилировался и работал в MS VS как .с файл (в будущем, возможно, потребуется .cpp), и в *nix как .с файл. Могут ли возникнуть какие-нибудь проблемы? Насколько широкий охват компиляторов сейчас желателен? (Программа, может быть, будет OpenSource).

    Заранее благодарен.
     
  2. s0larian

    s0larian New Member

    Публикаций:
    0
    Регистрация:
    15 июл 2004
    Сообщения:
    489
    Адрес:
    Крыжёпполь
    gcc: typedef unsigned long long uint64;
    vc++: typedef unsigned __int64 uin64;

    uint64 i = (uint64)-1;
    char buff[64];
    sprintf(buff, "%I64u", i);