如何保证C ++类型的位数

时间:2012-10-31 06:39:06

标签: c++ types cross-platform typedef

我期待typedef我自己的算术类型(例如Byte8,Int16,Int32,Float754等),目的是确保它们包含特定数量的位(并且在浮点数的情况下,遵守到IEEE754格式)。我怎样才能以完全跨平台的方式做到这一点?

我已经看到了C / C ++标准的片段,并且有很多:

类型 至少 x 字节”

而不是很多:

类型 完全 x 字节”。

鉴于typedef Int16 unsigned short int可能不一定会产生16位Int16,是否有跨平台方式来保证我的类型具有特定的大小?

5 个答案:

答案 0 :(得分:8)

您可以使用int8_t, int16_t, int32_t, int64_t中声明的精确宽度整数类型<cstdint>。这样,大小在所有平台上都是固定的

答案 1 :(得分:5)

真正保证精确位数的唯一可行方法是使用位域:

struct X { 
    int abc : 14; // exactly 14 bits, regardless of platform
};

您可以通过这种方式指定大小的上限 - int至少16位,long至少32位(但现代平台最多可容纳64位)任何一个)。但请注意,虽然这可以保证X::abc上的算术将使用(或至少模拟)恰好14位,但保证struct X的大小是提供14位所需的最小字节数(例如,给定的8位字节,其大小可以很容易地为4或8而不是绝对必要的2)。

C和C ++标准现在都包含固定大小类型的规范(例如int8_tint16_t),但不保证它们会出现。如果平台提供正确的类型,则需要它们,否则将不存在。如果内存服务,则还需要使用2的补码表示,因此具有16位1的补码整数类型的平台(例如)仍然不会定义int16_t

答案 2 :(得分:4)

查看stdint.h中声明的类型。这是standard library的一部分,因此预计(尽管在技术上无法保证)在任何地方都可用。此处声明的类型包括int8_tuint8_tint16_tuint16_tint32_tuint32_tint64_t和{ {1}}。本地实现会将这些类型映射到给定编译器和体系结构的适当宽度类型。

答案 3 :(得分:4)

这是不可能的。

有些平台char为16位甚至32位。

请注意,我并不是说理论平台会发生这种情况......这是一种真实且非常具体的可能性(例如DSP)。

在那种硬件上,没有办法仅将8位用于操作,例如,如果你需要8位模运算,那么唯一的方法是自己进行屏蔽操作。

C语言不能为您提供这种模拟......

使用C ++,你可以尝试在大多数情况下构建一个行为类似于预期的 native 基本类型的类(显然排除了sizeof)。结果将会有真正糟糕的表现。

我认为没有任何使用硬件的方式违背其性质的用例是个好主意。

答案 4 :(得分:3)

可以在编译时使用C ++模板来动态检查和创建符合您要求的新类型,特别是该类型的sizeof()是您想要的正确大小。

看一下这段代码:Compile time "if"

请注意,如果请求的类型不可用,那么您的程序完全可能无法编译。这取决于它是否适合你!