以下以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