关于 size_t , uintptr_t , intptr_t, int

来源:互联网 发布:cs反恐精英1.6数据修改 编辑:程序博客网 时间:2024/05/20 02:22

C++标准没有规定size_t , uintptr_t , intptr_t, int 这几个东西的byte数,所以任何确定地说这几个东西没区别,或者

确定地说这几个东西占XX个bit的行为都是耍流氓. 那么这几个东西有什么区别呢? 


int : 这个不用说了吧

size_t : 在当前平台下可能出现的最大数组尺寸.size_t必须是个unsigned但没有规定这个数和int的关系.

这个数在MSVC下是typedef unsigned int size_t, 但不要认为size_t 就是uint.

C++标准只规定了size_t 的最大值在当前目标平台(或者编译器)下一定能容纳的数组的最大尺寸. 假如我们有个平台,最大

数组尺寸为2^32 bit,那么size_t 的bit数可能是32,33,34.... 但不会小于32. 因为他必须能够表示当前平台下最大的数组尺寸那个值.

它和unsigned int的关系就是它们根本没有关系. 在某个目标平台下, unsigned int 没准是256个bit,而size_t 是16bit,这也是可能的.


intptr_t ,uintptr_t : 表示当前平台下能够安全地对指针进行转型的整型变量. 有些时候,我们不得不对一些指针进行一些整型转换

来执行一些指针类型无法操作的功能. 会写这样的代码: 

float* p=new float[...];//.........................int a=(int)p;
这是不安全的,因为C++标准没有规定int类型一定能够容纳float*类型的全部值. 例如在某个特定平台下, float* 可能占4byte,但int只占2byte.

比较安全的转换是:

float* p=new float[...];//.........................intptr_t a=(intptr_t)p;uintptr_t a2=(uintptr_t)p;
此时是相对安全的,因为intptr_t和uintptr_t和float* 所占byte数是一样的.

intptr_t 和uintptr_t 显然是一个有符号一个无符号,但实际上我认为这俩没什么区别,因为有符号和无符号对加减法,求余来说计算出来的是一样的数值.

至于乘除法......我实在想不出来对一个指针转过来的整型做乘除法有什么意义..

原创粉丝点击