32位与64位的区别:
- 内存寻址大小不同,64位管理的内存空间远远大于32位的内存空间
- 数据存取单位不同,32位4个字节与64位8个字节的区别
- 数据类型大小,体现明显是long类型及指针类型
- 数据结构对齐不同
数据类型取值:
32位、64位操作系统类型取值范围:数值以补码的方式存储,正值的补码是原码本身,负值的补码是保持符号位不动,其他值取反+1,+0-0问题,-0作为负值的最小值,所以负值的范围比正值的多1。
不管是原码还是补码, 总会出现 -0 这个值。 本来 +0 与 -0 是没有区别的。 但对于存储器和编译器来讲,总得充分利用每个字节吧, 更不想出现二义性。那么,干脆将 -0 表示为 -128 , 这样一来,既增大了signed char 数值的表示范围,又消除了 -0 的二义性, 岂不美哉!
无符号类型取值范围=0 , 2^位长-1
有符号类型取值范围=-2^(位长-1) , 2^(位长-1)-1
类型 | 32位字节 | 64位字节 | 取值范围 |
---|---|---|---|
boolean | 1 | 1 | true,false |
char | 1 | 1 | -2^(8-1) , 2^(8-1)-1 |
unsgined char | 1 | 1 | 0,2^8-1 |
short | 2 | 2 | -2^(16-1) , 2^(16-1)-1 |
unsigned short | 2 | 2 | 0~2^16-1 |
int | 4 | 4 | -2^(32-1) , 2^(32-1)-1 |
unsigned int | 4 | 4 | 0 , 2^32-1 |
long | 4 | 8 | |
unsigned long | 4 | 8 | |
long long | 8 | 8 | 2^(64-1) , 2^(64-1)-1 |
float | 4 | 4 | |
double | 8 | 8 | |
void | 0 | 0 | |
pointer | 4 | 8 |
数据结构对齐:
为了提高内存存取效率,一般采用字节对齐。
字节对齐就是变量存储的地址是变量的有效字节对齐值的整数倍,即: address%最终有效字节对齐值 = 0;
变量字节对齐值 原则:
- 变量的自身字节对齐值
简单类型变量
对于char型数据,其自身对齐值为1,对于short型为2,对于int,float,double类型,其自身对齐值为4,单位字节。
结构类型或联合类型:
自身字节对齐值的大小是其成员中最大基本类型要求的有效字节对齐值 - 编译器要求的字节对齐值:
编译器设置要求的字节对齐值,32位按4个字节对齐,64位按8位对齐 - 最终有效的字节对齐值:
在自身字节对齐值和编译器要求的字节对齐值中取较小的。