3

是否有一个整数数据类型在 16 位平台上总是正好是 2 个字节,在 32 位平台上是 4 个字节,在 64 位平台上是 8 个字节?假设 C++11,它将用于计算,而不是内存寻址。

有std::size_t,但签名的等价物是什么(std::ptrdiff_t?),它是否保证满足要​​求?

有 std::intptr_t 和 std::uintptr_t,但它们的大小并不总是与 size_t 相同

有std::int_leastN_t和std::int_fastN_t,但要么保证满足要​​求,如果是这样,'N'的正确值是多少?

Boost 是否提供类似 a(n) int_native_t 和 uint_native_t 的东西?

4

6 回答 6

7

这个问题的问题在于,诸如“16 位”或“32 位”之类的术语(通常源自本质上是 CPU 实现细节)如何转换为用户空间并不清楚。

例如,基于 Z80 的 8 位机器同时具有 8 位和 16 位寄存器和 16 位寻址内存,因此它们的 C 实现具有int16 位宽。16 位机器(Amiga、Atari ST)具有 32 位寄存器或使用段来寻址超过 64k 的内存(80286)。来自不同制造商的 Amiga C 编译器实现了不同的宽度int,并且没有公认的“原生” int

关键不是你不能依赖intlong告诉你架构的“大小”——这是你问题的前提——而是架构宽度实际上与 C 实现无关。在编写 C 代码时,您不应该关心总线的宽度,或者处理器内部一次抓取的位数。(如果您真的需要关心这一点,那么您可能一开始就编写了不可移植的低级代码,并且从可移植类型声明中获益甚少。)

应该关心的是诸如您可以寻址的最大内存位置以及它是否适合整数类型、两个指针之差的大小或最大数组索引的大小等等。您可能还关心与系统接口的类型的宽度,例如您可以表示的纪元以来的最大时间段,或者您可以处理的文件的最大索引。您可以通过调整到标准 C 类型(例如intptr_tptrdiff_tsize_ttime_t、等)来获得所有这些off_t— 这就是它们的用途。

于 2013-10-15T22:24:49.543 回答
4

最简洁的答案是不。

最接近的可能int是标准所说的“......具有执行环境架构所建议的自然大小......”虽然这有点模糊并且基本上无法执行。例如,许多 64 位编译器仍然使用 32 位int.

于 2013-10-15T21:51:28.983 回答
1

的有符号等价物std::size_tstd::ssize_t

于 2013-10-15T21:47:28.660 回答
0

如果它存在于您的版本中<cstdint>,则形式的值uintN_t(其中N是位数)并且intN_t是精确宽度整数类型。不过,它们是可选的。

于 2013-10-15T21:51:17.843 回答
0

你可以使用模板实现一些东西:

#include <cstdint>

template<int size> struct native_ints;

template<> struct native_ints<2> {
    using signed_int = std::int16_t;
    using unsigned_int = std::uint16_t;
};

template<> struct native_ints<4> {
    using signed_int = std::int32_t;
    using unsigned_int = std::uint32_t;
};

template<> struct native_ints<8> {
    using signed_int = std::int64_t;
    using unsigned_int = std::uint64_t;
};

using int_native_t = typename native_ints<sizeof(std::intptr_t)>::signed_int;
using uint_native_t = typename native_ints<sizeof(std::intptr_t)>::unsigned_int;

这依赖于intptr_t本机机器整数的大小。

于 2019-06-13T16:02:02.197 回答
-1

根据这个你可以做

// Check windows
#if _WIN32 || _WIN64
#if _WIN64
typedef uint64_t my_int;
#else
typedef uint32_t my_int;
#endif
#endif

// Check GCC
#if __GNUC__
#if __x86_64__ || __ppc64__
typedef uint64_t my_int;
#else
typedef uint32_t my_int;
#endif
#endif

但这显然不是 16 位架构的解决方案。

于 2013-10-15T21:51:30.080 回答