先明确一下几个概念:
位:是一个二进制位: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