Целые числа фиксированной ширины в C ++ - PullRequest
19 голосов
/ 09 апреля 2009

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

Мой вопрос: как лучше всего использовать целые числа фиксированной ширины в C ++?

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

Ответы [ 6 ]

18 голосов
/ 09 апреля 2009

Вы можете обойти проблему с некоторыми директивами #ifdef.

#ifdef _MSC_VER
   typedef __int16 int16_t
#else
   #include <stdint.h>
#endif
12 голосов
/ 09 апреля 2009

В Boost есть typedef для всех типов C99 и более: "Увеличить целочисленную библиотеку"

7 голосов
/ 09 апреля 2009

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

3 голосов
/ 09 апреля 2009

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

Да.

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

1 голос
/ 09 апреля 2009

Я использовал общедоступную (не GPL - настоящую общедоступную) версию stdint.h Дэнни Смита, которая доступна в пакете mingw:

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

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

0 голосов
/ 09 апреля 2009

Есть разные пути. Большинство сред считают, что short int s - 16 бит, а long int s - 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 для того, что включают все биты, плюс, конечно, размер любых других полей.

...