32位和64位的区别--深入理解计算机系统笔记一

来源:互联网 发布:unity3d 5.x下载 编辑:程序博客网 时间:2024/05/19 23:55

先明确一下几个概念:

位:是一个二进制位:1或0

字长:整数和指针数据的标称大小(norminal size),就是这里的32位或64位

内存:用来装载程序(指令)和数据的地方(还包括全局数据区、堆、栈、系统核心程序),内存地址是一个整数(如c语言中的指针指向的内存地址),cpu从内存地址读取指令,执行加减或逻辑运算操作。

最大的内存地址是整数的最大值,在32位的操作系统中,整数由32位二进制数组成,最大值等于2^32-1, 寻址空间是2^32-1,大约是4G

因此说32位操作系统内存最大只能是4G,而64位就远不止4G了。


C语言中各种数据类型在32位和64位的字节数大部分都相同:

char :1个字节, 8位 ,表示十进制区间:  -128 ~ 127

short int  :2个字节,16位  -2^15~(2^15-1)   short int可以简写为short

int : 4个字节,32位 -2^31~2^31-1 (很多地方写着int是2个字节,那是在早期16位系统下)

(特殊情况:在 64位机器下的许多程序设计环境,“int”变量仍然是 32位宽,不过“long”和指针是 64位宽,上述内容称为 LP64 数据模型。另一个选择是 ILP64 数据模型,三种数据型态都是 64位宽,甚至 SILP64 连“short”变量也是 64位宽。

参考:http://zh.wikipedia.org/wiki/64%E4%BD%8D%E5%85%83 )

float : 4个字节

double:8个字节

long long int 8个字节

不同的地方:

char*     32位下是4个字节   vs 64位下是8个字节

long int  32位下是4个字节   vs 64位下是8个字节

 

 #include <iostream>int main (int argc, char* argv[]){char a='a';char * cStar;int i=1;short int si=1;long l=123l;    long int li=123L;long long int ll=123;float f=1.1f;double d=1.1;std::cout<<"char: "<<sizeof(a)<<std::endl;std::cout<<"char*: "<<sizeof(cStar)<<std::endl;std::cout<<"int: "<<sizeof(i)<<std::endl;std::cout<<"short int: "<<sizeof(si)<<std::endl;std::cout<<"long: "<<sizeof(l)<<std::endl;std::cout<<"long int : "<<sizeof(li)<<std::endl;std::cout<<"long long : "<<sizeof(ll)<<std::endl;std::cout<<"float: "<<sizeof(f)<<std::endl;std::cout<<"double: "<<sizeof(d)<<std::endl;}

32位系统下输出:

char: 1
char*: 4
int: 4
short int: 2
long: 4
long int : 4
long long : 8
float: 4
double: 8