64 bit Linux下程序开发注意事项

转载 2012年03月26日 10:30:07
64 bit Linux下程序开发注意事项
2010-05-12 15:36

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。

1 32 位和 64 位C数据类型

32和64位C语言内置数据类型,如下表所示。


上表中第一行的大写字母和数字含义如下所示:

I表示:int类型

L表示:long类型

P表示:pointer指针类型

32表示:32位系统

64表示64位系统

如:LP64表示,在64位系统下的long类型和pointer类型长度为64位。

64位Linux 使用了 LP64 标准,即:long类型和pointer类型长度为64位,其他类型的长度和32位系统下相同类型的长度相同,32位和64位下类型的长度比较见上图的蓝色部分。

下图为在32和64位linux系统下使用sizeof检测出的数据类型的长度。

32位平台下结果:


64位平台下结果:


2 64系统下开发注意事项

2.1 格式化字符串:long使用%ld,指针使用%p,例如:

char *ptr = &something;

printf (%x\n", ptr);

上面的代码在 64 位系统上不正确,只显示低 4 字节的内容。正确的方法是:使用 %p。

char *ptr = &something;

printf (%p\n", ptr);

2.2 数字常量:常量要加L

例1,常数 0xFFFFFFFF 是一个有符号的 long 类型。在 32 位系统上,这会将所有位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了,结果是这个值是 0x00000000FFFFFFFF。

例2,在下面的代码中,a 的最大值可以是 31。这是因为 1 << a 是 int 类型的。

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);

32位下是-1,在64位下是4294967295。原因在于表达式(i+j)是一个unsigned int

表达式,但把它赋值给k时,符号位没有被扩展。要解决这个问题,两端的操作数只要均为signed或均为unsigned就可。

2.4 转换截断

转换截断发生在把long转换成int时,如下例:

int length = (int) strlen(str);

strlen返回size_t(它在LP64中是unsigned long),当赋值给一个int时,截断是必然发生的。而通常,截断只会在str的长度大于2GB时才会发生,这种情况在程序中一般不会出现。虽然如此,也应该尽量使用适当的多态类型(如size_t、uintptr_t等等)。

2.5 赋值,

不要交换使用 int 和 long 类型,例如:

int i;

time_t l;

i = l;

不要使用 int 类型来存储指针,例如:

unsigned int i, *ptr;

i = (unsigned) ptr;

不要使用指针来存放 int 类型的值。例如:

int *ptr;

int i;

ptr = (int *) i;

2.6 移植倒64位环境下的性能

移植到64位平台后,性能实际上降低了。原因是64位中的指针长度和数据大小有关,并由此引发的缓存命中率降低、数据对齐等问题。通过改变结构中数据排列的先后顺序,会因为少了填充数据,存储空间也随之减少。如:


2.7 程序中链接到的库要使用64位的库。

由上可见所有的问题都是由long和指针长度改变引起,在开发过程中只有牢记long和指针类型的长度。

一个程序员的总结——开发注意事项

一年到头了,作为本命年的我,今年发生了太多的事情,但是不幸的是,都是好事儿,有点太过得意洋洋了,不过,不管一年顺抑或不顺,都是需要总结的,毕竟,总结,才能让人成长,首先,想注意的事情就是开发注意事项。...
  • laner0515
  • laner0515
  • 2015年02月25日 19:04
  • 5130

32位与64位编程注意事项总结

http://www.oschina.net/p/flowvisor   http://www.cnblogs.com/centimeter/articles/2395405.html   h...
  • benpaobagzb
  • benpaobagzb
  • 2016年02月22日 21:41
  • 8140

Java Web项目从Windows移植到Linux注意事项

我将自己做的Java Web爬虫管理系统
  • u010388829
  • u010388829
  • 2014年09月02日 18:50
  • 2428

64 bit Linux下程序开发注意事项

转自: http://blog.sina.com.cn/s/blog_57421ff80100c7g1.html 64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件...
  • Sasoritattoo
  • Sasoritattoo
  • 2014年01月16日 19:59
  • 801

64 bit Linux下程序开发注意事项

64 位的优点:64 位的应用程序可以直接访问 4EB 的内存和文件大小最大达到4 EB(2 的 63 次幂);可以访问大型数据库。本文介绍的是64位下C语言开发程序注意事项。 1 32 位和 64...
  • chudongfang2015
  • chudongfang2015
  • 2016年05月01日 23:12
  • 231

X86平台Linux 32bit和64bit编程注意事项

http://www.ibm.com/developerworks/cn/linux/l-pow-inteltopwr/index.html 关于作者:Calvin Sze 是 IBM eServe...
  • jiayanhui2877
  • jiayanhui2877
  • 2013年03月09日 19:14
  • 1368

微信小程序开发过程中总结的注意事项

1、picker从后台动态取值             区域:{{objectArray[index].name}}        array: ['环翠区', '高区'...
  • yelin042
  • yelin042
  • 2018年01月16日 10:23
  • 42

程序开发是编写sql语句的注意事项

一、操作符优化 1、IN 操作符 用IN写出来的SQL的优点是比较容易写及清晰易懂,这比较适合现代软件开发的风格。但是用IN的SQL性能总是比较低的,从Oracle执行的步骤来分析用IN的SQL与不...
  • GarfieldEr007
  • GarfieldEr007
  • 2016年12月21日 23:17
  • 295

小程序开发注意事项

1.必需:https 2.不能直接进行dom节点操作,使用wx.request或者ajax从后台返回数据之后,封装到data中,之后从data中取数据,进行页面渲染. 3.小程序是否支持返回uni...
  • yunzhonghefei
  • yunzhonghefei
  • 2017年03月15日 09:29
  • 303

微信小程序开发过程中总结的注意事项

picker动态取值  objectArray: [       {         id: 12,         name: '环翠区'       },       {         id...
  • suixufeng
  • suixufeng
  • 2017年03月23日 17:02
  • 1743
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:64 bit Linux下程序开发注意事项
举报原因:
原因补充:

(最多只允许输入30个字)