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

sni*_*ils 3 c++ embedded boost c++11

是否有一个整数数据类型,在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是否提供类似于(n)int_native_t和uint_native_t的东西?

use*_*342 7

这个问题的问题在于,通常从基本上是CPU实现细节产生的诸如"16位"或"32位"之类的术语如何转换为用户空间并不是很清楚.

例如,基于Z80的8位机器具有8位和16位寄存器以及16位寻址存储器,因此它们的C实现为int16位宽.16位机器(Amiga,Atari ST)具有32位寄存器或使用段来处理超过64k的存储器(80286).来自不同制造商的Amiga C编译器实现了不同的宽度int,并且没有接受"原生" int.

关键不在于您不能依赖intlong告诉您架构的"大小" - 这是您的问题的前提 - 但架构宽度实际上与C实现无关.编写C代码时,您不应该关心总线的宽度,也不应该关心处理器内部一次抓取的位数.(如果你真的需要关心它,你可能会开始编写非可移植的低级代码,并且从便携式类型声明中获得的好处很少.)

应该关注的是诸如可以解决的最大内存位置以及它是否适合整数类型,两个指针的差异大小或最大数组索引的大小等等.您可能还关心与系统接口的类型的宽度,例如您可以表示的纪元以来的最大时间段,或者您可以解决的文件中的最大索引.你得到所有这些通过调整到标准的C类型,例如intptr_t,ptrdiff_t,size_t,time_t,off_t,和其他人-这是他们在做什么了.