32 位机器与 64 位机器
(1) AMD64 , IntelEM64T, IA64
在 64 位机器上运行 32 位程序需要操作系统提供一个仿真的环境。所以对于软件开发者来
说,需要重新编写或者重新编译源代码方可真正支持 64 位的系统,而这需要有 64 位编译
器的支持才行。目前在 64 位编译器方面,除 Intel 和 AMD 这些 CPU 厂商外,还有 HP、IBM
和 Sun、微软等公司以及一些独立编译器开发厂商都在努力地进行研究。
硬件:
寄存器数量增加了一倍,寄存器的位数增加了一倍。
AMD:Athlon64,Opteron64; Intel:Pen64,Xeon64
AMD:40bit; Intel:36bit
32 位计算机的 CPU 一次最多能处理 32 位数据,寄存器是 32 位的。因为指针是将整个
寄存器都涨满,所以指针为 4 个字节,最大寻址空间是(2^32)4GB。
64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到 4 EB(2 的
63 次幂);可以访问大型数据库。
区别:
要想让表达式在 32 位和 64 位系统上都可以正确工作,请注意以下规则:
两个有符号整数相加的结果是一个有符号整数。
int 和 long 类型的两个数相加,结果是一个 long 类型的数。
如果一个操作数是无符号整数,另外一个操作数是有符号整数,那么表达式的结果就是
无符号整数。
例子:
long k;
int i = -2;
unsigned int j = 1;
k = i + j;
printf("Answer: %ld", k);
k?
int 和 doubule 类型的两个数相加,结果是一个 double 类型的数。此处 int 类型的
数在执行加法运算之前转换成 double 类型。
在32位上,这些类型默认使用一个机器字(4字节)对齐。
在 64 位上,这些类型默认使用最大两个机器字(8×2=16 字节)对齐
声明整形常量最好加上”L” 或”U”;
使用无符号整数来防止符号扩展。
两种平台都需要是 32 位的就定义成 int
两个平台都需要 64 位就定义成 long long
一个需要 32 位,一个需要 64 位,就定义成 long
将数字变量什么为 int 或 long
将字符指针声明位无符号类型,防止 8 位字符的扩展位
Int 与 long 不能交换
Int 不能存储指针,指针也不能存储 Int
Printf()里面 int 用%d; long 用%ld; 指针用%p