强制类型为特定大小

Forcing types to a specific size

本文关键字:类型      更新时间:2023-10-16

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

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

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

幸运的是,其他人也注意到了同样的问题。在 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等。

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

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

例:int32_t始终为 32 位。

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

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

std::numeric_limits<int>::digits

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

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

会给你最大值。