我们知道在C/C++中,标准只是规定了int等等数据类型至少要多少位,所以坏处就是不同的机器上同一个类型关键字可能表示不同的范围。
1.由不确定变为确定
有的应用需要在不管什么机器上都得到绝对的位数,所以就有了
int8_t,int16_t,int32_t,int64_t
uint8_t,uint16_t,uint32_t,uint64_t
以上这些都是不管在什么平台上都是固定的8位,16位,32位,64位,增加了可移植性。
2.由绝对变为相对
经常遇到size_t,ssize_t,sizt_type,socklen_t,unsigned int等等表达,搞地非常糊涂。
在查看了一些资料有
A..《深入理解计算机系统》 10.3节
B.http://jeremybai.github.io/blog/2014/09/10/size-t/
总结如下
(1)size_t与unsined int
①unsigened int在不同的机器上都有一个最低的实现要求。
所以可以将unsigned int最低要求的位数看做一个绝对值。
而在表达比如一个数组最大有多少个元素的时候,受到这个机器的位数限制。
而不同的机器位数不同,小位数的机器上无需这么大,大位数的机器有可能又不够。
所以size_t就表示某个机器的最大值,是一个相对值。
(2)ssize_t和socklen_t
这两个都是有符号类型。
ssize_t当然和size_t相对应,表示某一机器上的最大的范围了,不同的是ssize_t是最大的有符号数。
而socklen_t是表示描述符的,应该使用int,但是编写socket源码的人错误地使用了unsigned int,又不想承认错误修改为int,就自创了一个类型,其实质就是int
(3)size_type
在STL里面针对各个容器,表示其能够表示的大小而专门定义的数据类型,其实质就是size_t