2

我正在寻找typedef我自己的算术类型(例如 Byte8、Int16、Int32、Float754 等),以确保它们包含特定数量的位(对于浮点数,遵守 IEEE754 格式)。我怎样才能以完全跨平台的方式做到这一点?

我在这里和那里看到了 C/C++ 标准的片段,其中有很多:

类型至少为 x字节

而不是很多:

类型正好 x个字节”。

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

4

5 回答 5

9

您可以使用int8_t, int16_t, int32_t, int64_t<cstdint>. 这样尺寸在所有平台上都是固定的

于 2012-10-31T06:42:02.407 回答
6

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

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

您可以通过这种方式指定的大小有一些上限—— 至少 16 位int和 32 位long(但现代平台可能很容易允许两者都达到 64 位)。但是请注意,虽然这保证了算术 onX::abc将使用(或至少模拟)恰好 14 位,但它并不能保证 a 的大小struct X是提供 14 位所需的最小字节数(例如,给定 8 位字节,它的大小很容易是 4 或 8,而不是绝对必要的 2)。

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

于 2012-10-31T06:50:15.523 回答
4

查看stdint.h中声明的类型。这是标准库的一部分,因此预计(虽然技术上不保证)在任何地方都可用。这里声明的类型包括int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t, int64_t, 和uint64_t. 本地实现会将这些类型映射到给定编译器和架构的适当宽度类型。

于 2012-10-31T06:46:59.283 回答
4

这是不可能的。

有些平台char是 16 位甚至 32 位的。

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

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

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

使用 C++,您可以尝试构建一个在大多数情况下表现得像预期的原生sizeof基本类型的类(显然,排除 )。然而,结果将有真正可怕的表现。

我认为没有任何用例以这种方式强制硬件违背其本质是一个好主意。

于 2012-10-31T06:48:19.890 回答
3

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

看看这段代码:编译时间 "if"

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

于 2012-10-31T06:50:49.120 回答