64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。
1. 32 位和 64 位C数据类型
32和64位C语言内置数据类型,如下表所示:
上表中第一行的大写字母和数字含义如下所示:
I表示:int类型
L表示:long类型
P表示:pointer指针类型
32表示:32位系统
64表示64位系统
如:LP64表示,在64位系统下的long类型和pointer类型长度为64位。
下图为在32和64位linux系统下使用sizeof检测出的数据类型的长度。
32位平台下结果:
64位平台下结果:
2. 64系统下开发注意事项:
2.1 格式化字符串:long使用%ld,指针使用%p,例如:
- char *ptr = &something;
- printf (%x\n", ptr);
char *ptr = &something; printf (%x\n", ptr);
上面的代码在 64 位系统上不正确,只显示低 4 字节的内容正确的方法是:使用 %p,如下:
- char *ptr = &something;
- printf (%p\n", ptr);
char *ptr = &something; printf (%p\n", ptr);
2。
long l = 1 << a;
要在 64 位系统上进行位移,应使用 1L,如下所示:
long l = 1L << a;
2.3 符号扩展:避免有符号数与无符号数运算,例如:
- int i = -2;
- unsigned int j = 1;
- long l = i + j;
- printf("Answer: %ld\n",l);
int i = -2;
unsigned int j = 1;
long l = i + j;
printf("Answer: %ld\n",l);
32位下是-1,在64位下是4294967295转换截断发生在把long转换成int时,如下例:
- int length = (int) strlen(str);
int length = (int) strlen(str);
strlen返回size_t(它在LP64中是unsigned long),当赋值给一个int时,截断是必然发生的uintptr_t等等)。
2.5 赋值:
不要交换使用 int 和 long 类型,例如:
- int i;
- time_t l;
int i; time_t l; i = l;
不要使用 int 类型来存储指针,例如:
- unsigned int i, *ptr;
- i = (unsigned) ptr;
unsigned int i, *ptr; i = (unsigned) ptr;
不要使用指针来存放 int 类型的值。例如:
- int *ptr;
- int i;
- ptr = (int *) i;
int *ptr; int i; ptr = (int *) i;
2:
移植到64位平台后,性能实际上降低了、数据对齐等问题。通过改变结构中数据排列的先后顺序,会因为少了填充数据,存储空间也随之减少。如:
2.7 程序中链接到的库要使用64位的库。
由上可见所有的问题都是由long和指针长度改变引起,在开发过程中只有牢记long和指针类型的长度。
转自:http://blog.sina.com.cn/s/blog_57421ff80100c7g1.html