linux 32位向64位的移植常見問題

2021-08-22 14:13:00 字數 905 閱讀 1252

1. 資料截斷:

由於long型別變數的運算(賦值、比較、移位等)產生。long定義在x86上為32bits,而在ia64上為64bits.容易在與int型變數運算時出現異常。

處理方法:盡量避免不同型別變數間的運算,避免將長度較長的變數賦值到較短的變數中,統一變數長度可以解決這個問題。簡單的對於32位轉移到64位可以將所有long定義轉換為int定義。

2. 指標儲存:

在x86平台下,習慣使用int來儲存指標,並將指標直接參與到int型的運算中,而64位平台下指標大小為64bits,無法儲存到int中。對指標的運算也可能會因為資料長度的不一致導致異常。

處理方法:修改用於儲存傳遞指標的變數為intptr_t 型別定義,以保證平台相容性

3. 不規範的結構:

未命名或為指定數量的成員可能會出現異常

處理方法:命名未命名的成員,宣告型別符號,將long型定義轉為int型。

4. **中的直接數

直接使用16進製制數字進行賦值時(一般會隱含假設該變數為32位變數的前提) 可能出現異常。使用數字定義資料大小,進行移位運算時會出現異常。

處理方法:檢查**中的直接數字是否有表示32位有關的各種形式,如4,32, 0x7fffffff等,替換為巨集定義。

編寫**時注意可移植化:

1. 在32位與64位下使用同樣的標頭檔案

2. 使用嚴禁的格式定義,如:用off_t定義偏移量,用fpos_t定義檔案位置, intptr_t定義指標

3. 使用中定義的整數型別,不使用int,long,long long的傳統定義方式。使用帶有整形標示符引數的printf函式,不使用%d,%ld的格式化方式。

4. 使用固定寬度或巨集定義的整數型別,數字,掩碼

5. 對整形變數作邊界檢查。

6. 32位與64位程序共享記憶體操作時,使用64位作為操作字長。

Linux 32位向64位移植的一些問題及解決

1.資料截斷 由於long型別變數的運算 賦值 比較 移位等 產生。long定義在x86上為32bits,而在ia64上為64bits.容易在與int型變數運算時出現異常。處理方法 盡量避免不同型別變數間的運算,避免將長度較長的變數賦值到較短的變數中,統一變數長度可以解決這個問題。簡單的對於32位轉...

如何在linux 32位機器編譯64位程式

編譯64位程式,不一定要編譯機器是64位的,但是32位機器預設安裝的gcc編譯環境還是不能用來編譯64位程式。編譯64位程式,需要加上 m64編譯器引數,預設安裝的gcc已經支援該引數,但是缺少64位機器指令相關的檔案,所以不能編譯,會出現下面的錯誤 plain view plain copy in...

Linux32位和64位系統的區別及如何選擇?

32位作業系統表示32位cpu對記憶體定址的能力 64位作業系統表示64 位cpu對記憶體定址能力 32位作業系統只能安裝在32位cpu處理器和64位cpu處理器上 64位作業系統只能安裝在64位cpu處理器上 32位作業系統對記憶體不能超過4gb 64位作業系統對記憶體定址可以超過4gb,企業伺服...