这可能很难的一个具体原因是指针大小会有所不同。而不是指针占用32位,指针现在占用64位。
这是一个问题,如果该软件通过在C++中reinterpret_cast
(可能在一些非常低级代码发生)某处鞋拔的指针为int
,它发生,因为int
的大小工作和指针均在相同的尺寸。基本上,代码假定指针具有一定的大小。
能咬回来的另一种方式是,如果代码与幻数散落像4
而不是sizeof(void*)
,或0xffffffff
代替INT_MAX
或类似的东西。
如果软件依赖于库或64位不可用的函数,则可能没有64位版本的软件。您不能拥有32位和64位的应用程序。例如,在Windows中,有一个名为SetWindowLong
的函数,它只能接受32位数据,所以如果需要将指针传递给函数,它对于64位程序并不是很有用。这就是为什么有一个称为SetWindowLongPtr
的函数可以处理64位程序中的64位和32位程序中的32位。
请注意,即使在64位窗口中,Internet Explorer默认运行32位,因为绝大多数插件只能在32位上使用。一个很好的例子是the Adobe Flash Player,它只能用于32位。所以,即使是像Adobe这样的大公司,显然对于64位移植可能并不总是微不足道的。
移位操作可能会受到影响。例如,移位0x80000
在32位中保留10次会得到0x0
,但移位0x80000
在64位中保留10次会产生0x200000000
。
所有这些说法都没有真正的技术原因,如果代码写得很好,为什么将应用程序移植到64位上太困难了。最好的情况是,一个简单的项目重新配置和完全重建是所有需要的。
我愤世嫉俗的一面说,公司使用这种方式来实现计划过时 - 强制或鼓励人们升级到/购买最新的产品!
如果你想要一个很好的答案,你应该更具体。例如,制作64位版本的.NET应用程序是无脑的 - 将其设置为任何CPU或x64进行编译。很显然,你不是在谈论.NET应用程序,但你在谈论什么? :) – 2010-09-02 17:01:05
我在问一般什么是技术原因,这显然使得不可能使用完全相同的代码库来构建32位和64位应用程序。因为如果它只是重新编译,所有的库也可以作为64位等,然后所有的应用程序也可以重新编译为64位 - >即。没问题。 – Tuminoid 2010-09-02 17:11:17
“所有缺少的64位软件都不能简单地成为因为人们喜欢用神奇数字代码?!” - 很多缺少的64位软件可能是因为它不是必需的。有人请纠正我,如果我错了,但我听说的经验法则是:除非你可能寻址超过4 GB的内存,你应该编译为32位。 – 2010-09-02 17:30:33