Подтвердить что ты не робот

Целые числа фиксированной ширины в С++

Иногда мне нужно использовать целые числа фиксированной ширины для связи с внешними устройствами, такими как ПЛК. Я также использую их для определения битмасок и выполнения манипуляции с битами данных изображения. Стандарт AFAIK C99 определяет целые числа фиксированной ширины, такие как int16_t. Однако компилятор, который я использую, VС++ 2008 не поддерживает C99 и AFAIK. Microsoft не планирует его поддерживать.

Мой вопрос в том, что является наилучшей практикой использования целых чисел фиксированной ширины в С++?

Я знаю, что VС++ определяет нестандартные целые числа фиксированной ширины, такие как __int16, но я не решаюсь использовать нестандартный тип. Будет ли следующий стандарт С++ определять целые числа фиксированной ширины?

4b9b3361

Ответ 2

Вы можете решить эту проблему с помощью некоторых директив #ifdef.

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif

Ответ 3

Включите файл <stdint.h>, чтобы получить определения для типов типа uint16_t. По умолчанию VС++ не поставляется с <stdint.h>, но вы можете получить этот файл из нескольких мест. Wikipedia перечисляет несколько, и Google найдет вас намного больше.

Ответ 4

Будет ли следующий стандарт С++ определять целые числа фиксированной ширины?

Да.

Как сказал Мехрдад, вы можете использовать #ifdefs пока. Альтернативой была бы какая-то сложная магия шаблона. У Boost есть что-то в этом направлении, Boost Integer library.

Ответ 5

Я использовал версию D20, принадлежащую Danny Smith, доступную в пакете mingw:

Мне пришлось настроить эту версию для компиляции с некоторыми компиляторами не VC 8 (в основном VC6) - он хорошо меня обслуживал.

Возможно, на днях я расскажу о своей совместимой с VC6 версии. Изменения были довольно незначительными - только некоторые макроопределения для использования VC6 конкретных ключевых слов для 64-битных типов. Если вам не нужна поддержка VC6, версия mingw должна быть все, что вам нужно.

Ответ 6

Существуют разные пути. В большинстве сред будет установлено, что short int - 16 бит, а long int - 32. (long подразумевается, когда вы просто объявляете int.) Если вы typedef ваш собственный тип int16, вы, вероятно, закончите используя short int.

Другая возможность заключается в полях бит в структурах. Вы можете сказать что-то вроде:

struct x {
    int a : 16;
    int b : 5;
    ...
};

И так далее. Если вы затем определите:

struct x myvar;
myvar.a = 54;

Вы можете быть уверены, что myvar.a будет содержать 16 бит, а myvar.b будет использовать 5; общий размер myvar, округляющий для всех битов, плюс, конечно, размер любых других полей.