C++ 表示本机有符号和无符号整数大小的数据类型?

C++ 表示本机有符号和无符号整数大小的数据类型?,c++,boost,c++11,embedded,C++,Boost,C++11,Embedded,是否存在一种整数数据类型,在16位平台上始终精确为2字节,在32位平台上始终精确为4字节,在64位平台上始终精确为8字节?假设C++11,它将用于计算,而不是内存寻址 有std::size\u t,但是签名等价物(std::ptrdiff\u t?)是什么,它保证满足要求吗 有std::intptr\u t和std::uintptr\u t,但是 有std::int_leastN_t和std::int_fastN_t,但保证满足要求,如果是这样,“N”的正确值是多少 Boost是否提供(n)in

是否存在一种整数数据类型,在16位平台上始终精确为2字节,在32位平台上始终精确为4字节,在64位平台上始终精确为8字节?假设C++11,它将用于计算,而不是内存寻址

有std::size\u t,但是签名等价物(std::ptrdiff\u t?)是什么,它保证满足要求吗

有std::intptr\u t和std::uintptr\u t,但是

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


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

std::size_t的有符号等价物是
std::ssize_t
,如果它存在于
的版本中,则形式为
uintN_t
(其中
n
是位数)和
intN\u t
是精确的宽度整数类型。不过,它们是可选的。

简短的回答是否定的

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

,这取决于您的能力

// 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位体系结构的解决方案。

问题在于,我们根本不清楚“16位”或“32位”等术语是如何转化为用户空间的,这些术语通常来源于本质上的CPU实现细节

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

关键不是你不能依靠
int
long
来告诉你架构的“大小”——这是你问题的前提——而是架构宽度实际上与C实现无关。在编写C代码时,您不应该关心总线的宽度,也不应该关心处理器内部一次获取的位数。(如果您真的需要关心这一点,那么您可能首先编写非可移植的低级代码,并且从可移植类型声明中几乎得不到什么好处。)


您应该关心的是可以寻址的最大内存位置、它是否适合整数类型、两个指针的差值大小或最大数组索引的大小,等等。您可能还关心与系统接口的类型的宽度,例如可以表示的自历元以来的最大时间段,或者可以寻址的文件的最大索引。通过调整标准C类型,如
intptr\u t
ptrdiff\u t
size\u t
time\u t
off\u t
,以及其他类型,您可以使用模板实现以下功能:

#包括
模板结构本机输入;
模板结构本机\u int{
使用有符号的int=std::int16\t;
使用unsigned_int=std::uint16_t;
};
模板结构本机\u int{
使用有符号的int=std::int32\t;
使用unsigned_int=std::uint32_t;
};
模板结构本机\u int{
使用有符号的int=std::int64\t;
使用无符号的int=std::uint64\u t;
};
使用int_native_t=typename native_ints::signed_int;
使用uint\u native\u t=typename native\u ints::unsigned\u int;

这依赖于具有本机整数大小的
intptr\t

这不是简单的
int
?依赖于平台。C++没有告诉你有这样的类型,你不应该把它用于计算,应用程序不应该定义整数的大小,而不是底层的机器吗?不是真正的复制品,而是看看。更有趣的问题是,为什么你需要这样的东西?它真的是代码> STD::SiZeSt<<代码>。简单地说,
size\t
不应该编译。确定。除非有
使用名称空间std在它前面。
使用名称空间std。我认为有很多关于SO的帖子都在说明这一点。事实上,编辑帖子进行这样的更正是不好的,除非它是一篇社区维基帖子。建议注释的更改正好是正确的地方。<代码> ssiZeZt不是标准C++,它是基于POSIX规范的。我认为问题实际上恰恰相反——16位平台上是否有16位的类型,32位平台上是否有32位的类型等等。uintN\u t类型总是N位宽,无论平台如何谢谢,您的回答很有帮助。我了解到我真正想要的可以用
(u)int_fast\u35;#t
(u)int_least_35;t
数据类型来表示,这取决于我想要优化的内容。