C++中的固定宽度整数

omqzjyyz  于 2023-08-03  发布在  其他
关注(0)|答案(6)|浏览(99)

有时我需要使用固定宽度的整数与外部设备(如PLC)进行通信。我还使用它们来定义位掩码和执行图像数据的位操作。C99标准定义了固定宽度的整数,如int16_t。然而,我使用的编译器,VC++ 2008不支持C99和AFAIK微软不打算支持它。
我的问题是在C中使用固定宽度整数的最佳实践是什么?
我知道VC
定义了非标准的固定宽度整数,比如__int16,但我不太愿意使用非标准类型。下一个C++标准会定义固定宽度的整数吗?

gmxoilav

gmxoilav1#

您可以使用一些#ifdef指令来解决这个问题。

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

字符串

ruoxqz4g

ruoxqz4g2#

Boost具有所有C99类型的typedef以及更多类型:"Boost integer library"

7xllpg7q

7xllpg7q3#

包含文件<stdint.h>以获取uint16_t等类型的定义。VC++默认情况下不附带<stdint.h>,但您可以从多个位置获取该文件。维基百科列出了一些,谷歌会找到更多。

6ovsh4lw

6ovsh4lw4#

下一个C++标准会定义固定宽度的整数吗?
是:C++11 has fixed-width integers
正如Mehrdad所说,您现在可以使用#ifdefs。另一种选择是一些精心制作的模板魔术。Boost在这个方向上有一些东西,Boost Integer library

pbpqsu0x

pbpqsu0x5#

我使用了Danny Smith的stdint.h的公共域(不是GPL -真正的公共域)版本,该版本在mingw包中可用:

我不得不调整那个版本,以便用一些非VC 8编译器(主要是VC6)编译-它对我很有帮助。
也许有一天我会在某个地方发布我的VC6兼容版本。这些变化非常小--只是一些宏技巧,为64位类型使用VC6特定的关键字。如果你不需要VC6支持,mingw版本可能就是你所需要的。

lyfkaqu1

lyfkaqu16#

有不同的道路可走。大多数环境会认为short int是16位,而long int是32位。(当你简单地声明int时,long是隐含的。)如果你typedef你自己的int 16类型,你可能最终会使用short int
另一种可能性在于结构中的位字段。你可以这样说:

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

字符串
诸如此类。如果您定义:

struct x myvar;
myvar.a = 54;


你可以确定myvar. a将保存16位,myvar.b将使用5位;所有比特所包括的Myvar舍入的总大小,当然加上任何其它字段的大小。

相关问题