這可能很難的一個具體原因是指針大小會有所不同。而不是指針佔用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