关于 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 显然是一个有符号一个无符号,但实际上我认为这俩没什么区别,因为有符号和无符号对加减法,求余来说计算出来的是一样的数值.
至于乘除法......我实在想不出来对一个指针转过来的整型做乘除法有什么意义..
- 关于 size_t , uintptr_t , intptr_t, int
- size_t/ptrdiff_t/intptr_t/uintptr_t
- intptr_t, uintptr_t
- 使用intptr_t和uintptr_t
- 使用intptr_t和uintptr_t
- 使用intptr_t和uintptr_t
- intptr_t、uintptr_t数据类型的解析
- 关于intptr_t,64位linux系统中void *与int转换
- 关于 size_t
- 关于size_t
- int与size_t
- size_t 与 int 区别
- size_t、size_type、int
- Size_t和int区别
- size_t, wchar_t, int, long, void *
- int与size_t的区别
- size_t和int的区别
- 关于size_t与ssize_t
- 笔记本屏幕
- oracle数据库、客户端安装以及ps/sql连接和导入表实例
- Pig实战
- Edit Control 控件属性 添加消息 [大三TJB_708]
- 21-定义枚举的构造函数、方法和字段
- 关于 size_t , uintptr_t , intptr_t, int
- WebForm请求模型与MVC请求模型 图
- Linux从用户层到内核层系列 - GNU系列之你所不知道的printf
- idea 使用手册
- git 获取android source
- 表长(lua)
- 字符串逆序(lua实现)
- 职场晋升有玄机,老板红人最得意
- wash card(java 实现)