强制类型为特定大小

时间:2012-04-16 18:40:37

标签: c++ visual-c++

我一直在学习C ++,我不太满意的一件事是数据类型大小不一致。取决于在int上部署的内容可以是16位或32位等等。

所以我认为用数据类型(如字节,单词等)创建自己的头文件可能是一个好主意,这些数据类型被定义为特定大小,并将在任何平台上保持该大小。

两个问题。首先这是个好主意吗?或者是否会产生其他我不知道的问题?其次,如何将类型定义为8位?我不能只说#define BYTE char,因为char会因平台而异。

5 个答案:

答案 0 :(得分:3)

幸运的是,其他人也注意到了同样的问题。在C99和C ++ 11中(因此将编译器设置为与这两种模式之一兼容,编译器设置中应该有一个开关),它们添加了头文件stdint.h(用于C)和cstdint(用于C ++)。如果你#include <cstdint>,你得到类型int8_t,int16_t,int32_t,int64_t,并且对于无符号版本,前缀为u。如果您的平台支持这些类型,它们将在标题中与其他几个类型一起定义。

如果您的编译器尚未支持该标准(或者您因为无法控制的原因而被迫继续使用C ++ 03),那么还有Boost

但是,如果您完全关心类型的大小,则应该只使用它。在大多数情况下,intunsigned适用于丢弃变量。 size_t应该用于索引std::vector等。

答案 1 :(得分:1)

更好的是,使用stdint.h中已经定义的东西。有关详细信息,请参阅here。类似问题here

实施例: int32_t总是32位。

答案 2 :(得分:1)

首先,您需要弄清楚您是否真正关心的是什么尺寸。如果你使用int来计算文件中的行数,你真的关心它是32位还是64位?如果您正在处理打包的二进制数据,则需要BYTE,WORD等,但通常不会出于任何其他原因。所以你可能会担心一些无关紧要的事情。

答案 3 :(得分:0)

许多库都有自己的.h,其中包含大量的typedef以具有常量大小类型。这在制作可移植代码时很有用,并且避免依赖于您当前使用的平台的标题。

答案 4 :(得分:0)

如果您只想确保内置数据类型具有最小大小,可以使用标题中的std :: numeric_limits进行检查。

std::numeric_limits<int>::digits
例如,

将给出没有符号位的int的位数。和

std::numeric_limits<int>::max()

会给你最大值。