iParam = 0;
Func1(&iParam,100);
如果是一些已经定义好的结构体成员,则可通过临时变量来修改
Func(&stPlayer.shParam,100)
修改为
int iTmpParam = stPlayer.shParam;
Func(&iTmpParam,100);
stPlayer.shParam = iTmpParam;
比如下面这段代码,在32位系统上运行没有问题,但64位下运行异常:
if((leftTime + xxz::framework::GetCurrentTimeva l(NULL)) > 0 && (leftTime >= 0))
{
? ? ? ? n->expireTime = leftTime + xxz::framework::GetCurrentTimeva l(NULL);
}
else
{
? ? ? ? n->expireTime = 0x7FFFFFFF;
}
这里在64位下,如果lefttime等于0x7FFFFFFF,则lefttime + xxz::framework::GetCurrentTimeva l(NULL)的结果为long(因为xxz::framework::GetCurrentTimeva l(NULL)返回time_t,为long类型),因此不会溢出,这时相加的结果赋给一个整形(n->expireTime),则这个整形溢出,称为负值,从而发生错误。
改为:
if ((int64)leftTime + (int64)xxz::framework::GetCurrentTimeva l(NULL) >= (int64)0x7FFFFFFF)
{
? ? ? ? dstTime = 0x7FFFFFFF;
}
else
{
? ? ? ? dstTime = leftTime + xxz::framework::GetCurrentTimeva l(NULL);
}
1 修改代码,主要注意以下事项
去除所有的long,替换为固定大小的类型,如int32_t, int64_t等。
时间相关类型的全部用使用time_t来进行处理。
pointer之间的加减法使用intptr_t来存储结果,不要在pointer和int之间相互转换。
如果必须用size_t,比如STL,则传值赋值都用size_t,不要在int和size_t之间相互转换,以免结果被截断。
格式化字符串使用如下的兼容性定义来处理,避免告警:
#if __WORDSIZE == 64
#define FMT_SIZET "%u"
#else
#define FMT_SIZET "%lu"
2 替换外部库
这一步比较难,因为有些外部库没有64位版本,这就有可能需要推动外部库的64位化工作,或者将这部分功能挪到其它进程。
3 运营环境
修改脚本支持64位环境
一些数据需要用64位程序重新生成,供程序使用
主流的硬件供应商最近都在扩充自己的64位产品,这是因为64位平台可以提供更好的性能和可伸缩性。32位系统的限制,特别是4GB的虚拟内存上限,已经极大地刺激很多公司开始考虑迁移到64位平台上。了解如何将应用程序移植到64位体系结构上可以帮助我们编写可移植性更好且效率更高的代码。