C/C++中有关字长与平台无关的整数范例
副标题#e#
在C/C++中,整型的长度跟编译器相关,编译器的实现取决于CPU。 好比TC++是DOS16下的应用措施,DOS16是16位的操纵系统,所以TC++中sizeof(int)==16;同理win32中sizeof(int)==32。
C99尺度界说一个叫着<stdint.h>的头文件,该头文件界说了一系列各类类此外整数范例typedef名字。尽量速多C++东西支持该头文件已经有一段时间了,但它尚未正式收录于C++尺度,因此,在利用该头文件之前,你应该先阅读你的编译器文档,看看它是否支持该文件。在某些C++ 的编译器中,如GNC,为了能利用C99尺度的这些新特性,就在<inttypes.h>头文件中引入了这个文件< stdint.h>.
字长牢靠的整型范例
C99尺度在<stdint.h>这个头文件的范例界说中,有一套是字长牢靠的整型范例:
int8_t int16_t int32_t int64_t
与其对应的字长牢靠的无标记型整型范例有:
uint8_t uint16_t uint32_t uint64_t
它们的名字很是直观。譬喻,int8_t是长度牢靠为8比特的有标记整型范例,而uint8_t则是字长牢靠为8比特的无标记型整型范例。当你需要确保在差异的平台上,整型数据的字长牢靠稳定,那么你就可以利用这些typedef名字。答允对期望的性质举办更为具体的描写。譬喻,有的范例的名字是 int_least8_t,它至少有 8 位,尚有 int32_t,它刚好是 32 位。
C99尺度尺度担保至少可以会见 8 位、16 位、32 位和 64 位范例。没有担保会提供准确宽度范例。不要利用这种范例,除非您必定是实在不能接管更大的范例。另一个可选的范例是新的 intptr_t 范例,它是一个足够大的可以容纳一个指针的整数。并不是所有的系统都提供这样一种范例(尽量当前所有的 Linux 和 BSD 实现都提供)。
字长最小的快速整型范例
该头文件还界说了别的一套typedef名字,即“最小指定长度的快速整数范例”。这套typedef名字中的每一种都暗示一种整数范例,它满意在长度不小于某个指定长度的前提下,拥有最快的处理惩罚速度。这些整数范例的名字为int_fastX_t(有标记)可能uint_fastX_t(无标记),个中“X”暗示最小指定长度。譬喻,int_fast32_t指得是字长至少为32比特的快速有标记整型范例。最小字长快速整型范例有:
int_fast8_t int_fast16_t int_fast32_t int_fast64_t
对应的无标记整型范例有:
uint_fast8_t uint_fast16_t uint_fast32_t uint_fast64_t
什么环境下利用这些typedef名字?
假设你需要一个字长不少于16比特的轮回计数器,那么你会但愿该计数器的范例老是当前计较机CPU最佳操纵的整型范例,而int_fast16_t可以担保任何平台上的编译器老是选择字长不少于16比特的最快整型范例。
#include <inttypes.h>
for (int_fast16_t n=0; n<30000; ++n)
{
//.. do something
}
===================================================================
#p#副标题#e#
关于整型参数移植
如果你需要确定容量的整型,那么你应该利用stdint.h可能inttypes.h中界说的范例.
这些头文件中界说了以下的整数范例:
int8_t;
uint8_t;
int16_t;
uint16_t;
int32_t;
uint32_t;
int64_t;
uint64_t;
int_least8_t;
uint_least8_t;
int_least16_t;
uint_least16_t;
int_least32_t;
uint_least32_t;
int_least64_t;
uint_least64_t;
int_fast8_t;
uint_fast8_t;
int_fast16_t;
uint_fast16_t;
int_fast32_t;
uint_fast32_t;
int_fast64_t;
uint_fast64_t;
intptr_t;
uintptr_t;
intmax_t;
uintmax_t;
假如是boost库的用户则较量幸运,因为在boost库中,<cstdint.hpp>这个头文件封装了C99尺度<stdint.h>中的整数范例.