转自:http://www.cnblogs.com/aHuner/p/3336028.html
32位系统由于采用了物理地址扩展技术,使得操作系统可用物理内存能够超过4G,但对于单个程序来说,能够使用的内存(即地址空间)还是只有4G。GCC编译时加上-m32参数。
64位的内存容量大大增加,从4G扩展到18PB,可以在内存中存放更多的数据,避免频繁的磁盘读写IO,从而大大提高性能。也支持使用超过2G的文件。GCC编译时加上-m64参数。
32位和64位主要的区别就在于数据模型。
类型 | ILP32 | LP64 | LLP64 | ILP64 |
char | 8 | 8 | 8 | 8 |
short | 16 | 16 | 16 | 16 |
int | 32 | 32 | 32 | 64 |
long | 32 | 64 | 32 | 64 |
long long | 64 | 64 | 64 | 64 |
指针 | 32 | 64 | 64 | 64 |
RHEL5相关数据类型以及长度一览表:
下面有一道面试题,不用sizeof判断系统是32位还是64位?
答:
不管数据模型怎么样,但32和64最重要的区别就在于指针数据长度,32位是4字节,64位是8字节,所以根据这一根本的特性可以做这道题目。
int getsystembit()
{
char buf[17];
char * p = (char *)0;
sprintf(buf,"%p",p);
int systembit = strlen(buf)*4;
return systembit;
}
参考:
将 Linux 应用程序移植到 64 位系统上:
http://www.ibm.com/developerworks/cn/linux/l-port64.html
64位编程的33条军规:
http://wenku.baidu.com/view/7ecc8743336c1eb91a375dc5.html
linux GCC 64位编程技巧:
http://blog.youkuaiyun.com/yunhua_lee/article/details/5947173