代码之家  ›  专栏  ›  技术社区  ›  Dani van der Meer

C++中的固定宽度整数

  •  19
  • Dani van der Meer  · 技术社区  · 16 年前

    有时,我需要使用固定宽度整数与外部设备(如PLC)通信。我还使用它们来定义位掩码和执行图像数据的位操作。afaik c99标准定义了固定宽度的整数,比如int16,但是我使用的编译器vc++2008不支持c99,afaik Microsoft也不打算支持它。

    我的问题是在C++中使用固定宽度整数的最佳实践是什么?

    我知道vc++定义了非标准的固定宽度整数,比如uu int16,但我不太愿意使用非标准类型。下一个C++标准会定义固定宽度的整数吗?

    6 回复  |  直到 16 年前
        1
  •  12
  •   Hrvoje PrgeÅ¡a    16 年前

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

        2
  •  18
  •   Mehrdad Afshari    16 年前

    你可以用一些 #ifdef 指令。

    #ifdef _MSC_VER
       typedef __int16 int16_t
    #else
       #include <stdint.h>
    #endif
    
        3
  •  7
  •   Adam Rosenfield    16 年前

    包括文件 <stdint.h> 获取类型的定义,例如 uint16_t . VC++不附带 <斯坦福大学 默认情况下,但您可以从多个地方获取该文件。 Wikipedia 列出一些,谷歌会发现你更多。

        4
  •  3
  •   Konrad Rudolph    16 年前

    下一个C++标准会定义固定宽度的整数吗?

    对。

    就像我爸爸说的,你可以用 #ifdefs 现在。另一种选择是一些精心制作的模板魔术。Boost在这个方向上有一些东西, Boost Integer library .

        5
  •  1
  •   Michael Burr    16 年前

    我使用了公共域(不是GPL-真正的公共域)版本 stdint.h 作者:丹尼·史密斯,明格套餐中提供:

    我不得不调整那个版本,用一些非VC 8编译器(主要是VC6)进行编译——这对我很有帮助。

    也许有一天我会把兼容VC6的版本发布到某个地方。这些变化非常小——只是一些宏的小把戏,在64位类型中使用VC6特定的关键字。如果您不需要VC6支持,那么Mingw版本可能就是您所需要的。

        6
  •  0
  •   Peter    16 年前

    要走的路是不同的。大多数环境都会这样 short int s是16位,并且 long int S是32。(The long 当你简单地声明 int 如果你 typedef 你自己的Int16类型,你可能最终会使用 短整型 .

    另一种可能是结构中的位字段。你可以这样说:

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

    诸如此类。如果然后定义:

    struct x myvar;
    myvar.a = 54;
    

    您可以确定myvar.a将容纳16位,myvar.b将使用5位;myvar的总大小是所有位组成的四舍五入,当然还有任何其他字段的大小。