从long、short与int的长度说到编译器数据模型

以下以VC++的编译器为例:
short是short int 的简称,而long是long int的简称。
在16位系统中(只有16位编译器):
int、short型数据占2个字节(16位);long型数据占4个字节(32位)。
int、short可以表示的的最大范围是:-32768<---->32767
long 可以表示的最大范围是:-2147483648<---->2147483647

在32位(32位编译器)、64位系统中(32位编译器、64位编译器):
short型数据占2个字节(16位);int、float型数据占4个字节(32位);long long 型数据占8个字节(64位);char :1个字节。(编译器32位、64位相同)
char*(32位编译器): 4个字节;char*(64位编译器): 8个字节
long(32位编译器): 4个字节;long(64位编译器): 8个字节
所以,short可以表示的的最大范围是:-32768<---->32767
int、long 可以表示的最大范围是:-2147483648<---->2147483647
long long 可以表示的最大范围是:-9223372036854775808<—>9223372036854775807

VC++的编译器使用的是LLP64 模型,LLP64代表的是long long和pointer是64位的(占8字节,long是32位4字节),另外还有一种64位数据模型LP64,意思是long和pointer是64位(long long也是64位占8字节)。使用LLP64的编译器有VC++,使用LP64的编译器有Solaris、AIX、HP、Linux、Mac OS X、IBM z/OS原生编译器。
其他数据模型还有ILP32、ILP64、SILP32、SILP64,ILP32指int,long和pointer是32位的,ILP64指int,long和pointer是64位的,SILP32指short、int,long和pointer是32位的、SILP64指short、int,long和pointer是64位的。但是这些数据模型都不常用。
在这些数据类型中,float 都是4字节、double 都是8字节。

鉴于如上的情况,对于未知平台的机器来说,不建议使用long,C99标准代码如下可供参考:

typedef signed char        int8_t;
typedef short              int16_t;
typedef int                int32_t;
typedef long long          int64_t;
typedef unsigned char      uint8_t;
typedef unsigned short     uint16_t;
typedef unsigned int       uint32_t;
typedef unsigned long long uint64_t;

typedef long long          intmax_t;
typedef unsigned long long uintmax_t;

//这些宏获取的相应的最大最小长度,必须与Windows SDK的intsafe.h中的宏完全匹配。
#define INT8_MIN         (-127i8 - 1)
#define INT16_MIN        (-32767i16 - 1)
#define INT32_MIN        (-2147483647i32 - 1)
#define INT64_MIN        (-9223372036854775807i64 - 1)
#define INT8_MAX         127i8
#define INT16_MAX        32767i16
#define INT32_MAX        2147483647i32
#define INT64_MAX        9223372036854775807i64
#define UINT8_MAX        0xffui8
#define UINT16_MAX       0xffffui16
#define UINT32_MAX       0xffffffffui32
#define UINT64_MAX       0xffffffffffffffffui64
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值