2

我一直在学习 C++,我不太满意的一件事是数据类型大小不一致。根据部署在 int 上的系统的不同,可能是 16 位或 32 位等。

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

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

4

5 回答 5

4

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

如果您的编译器还不支持该标准(或者您由于无法控制的原因而被迫保留在 C++03 上),那么还有Boost

但是,只有在您完全关心类型的大小时才应该使用它。int并且unsigned在大多数情况下适用于一次性变量。size_t应该用于索引std::vector等。

于 2012-04-16T18:47:40.287 回答
1

更好的是,使用 stdint.h 中已经定义的内容。有关更多详细信息,请参见此处。类似的问题在这里

示例:int32_t 始终为 32 位。

于 2012-04-16T18:43:51.590 回答
1

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

于 2012-04-16T18:47:13.120 回答
0

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

于 2012-04-16T18:44:15.213 回答
0

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

std::numeric_limits<int>::digits

例如,将为您提供不带符号位的 int 的位数。和

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

会给你最大值。

于 2012-04-16T19:04:14.610 回答