從 32 位系統移植到 64 位系統
本節介紹如何解決一些常見的問題:
宣告要想讓您的**在 32 位和 64 位系統上都可以工作,請注意以下有關宣告的用法:
表示式在 c/c++ 中,表示式是基於結合律、操作符的優先順序和一組數學計算規則的。要想讓表示式在 32 位和 64 位系統上都可以正確工作,請注意以下規則:
賦值由於指標、int 和 long 在 64 位系統上大小不再相同了,因此根據這些變數是如何賦值和在應用程式中使用的,可能會出現問題。下面是有關賦值的一些技巧:
數字常量
16 進製的常量通常都用作掩碼或特殊位的值。如果乙個沒有字尾的 16 進製的常量是 32 位的,並且其高位被置位了,那麼它就可以作為無符號整型進行定義。
例如,常數 oxffffffffl 是乙個有符號的 long 型別。在 32 位系統上,這會將所有位都置位(每位全為 1),但是在 64 位系統上,只有低 32 位被置位了,結果是這個值是 0x00000000ffffffff。
如果我們希望所有位全部置位,那麼一種可移植的方法是定義乙個有符號的常數,其值為 -1。這會將所有位全部置位,因為它採用了二進位制補碼演算法。
long x = -1l;
可能產生的另外乙個問題是最高位的設定。在 32 位系統上,我們使用的是常量 0x80000000。但是可移植性更好的方法是使用乙個位移表示式:
1l << ((sizeof(long) * 8) - 1);
endianism
endianism 是指用來儲存資料的方法,它定義了整數和浮點資料型別中是如何對位元組進行定址的。
little-endian 是將低位位元組儲存在記憶體的低位址中,將高位位元組儲存在記憶體的高位址中。
big-endian 是將高位位元組儲存在記憶體的低位址中,將低位位元組儲存在記憶體的高位址中。
表 3 給出了乙個 64 位長整數的布局示例。
表 3. 64 位 long int 型別的布局
低位址高位址little endian
byte 0
byte 1
byte 2
byte 3
byte 4
byte 5
byte 6
byte 7
big endian
byte 7
byte 6
byte 5
byte 4
byte 3
byte 2
byte 1
byte 0
例如,32 位的字 0x12345678 在 big endian 機器上的布局如下:
表 4. 0x12345678 在 big-endian 系統上的布局
記憶體偏移量01
23記憶體內容
0x12
0x34
0x56
0x78
如果將 0x12345678 當作兩個半字來看待,分別是 0x1234 和 0x5678,那麼就會看到在 big endian 機器上是下面的情況:
表 5. 0x12345678 在 big-endian 系統上當作兩個半字來看待的情況
記憶體偏移量02
記憶體內容
0x1234
0x5678
然而,在 little endian 機器上,字 0x12345678 的布局如下所示:
表 6. 0x12345678 在 little-endian 系統上的布局
記憶體偏移量01
23記憶體內容
0x78
0x56
0x34
0x12
將 MFC 應用程式移植到 Linux
第一種方法 找乙個類似mfc框架的程式庫。您可能仍然在維護用微軟基礎類庫 microsoft foundation classes mfc 構建的舊的 windows 應用程式,而現在卻有客戶要求 linux 版本,該怎麼辦呢?在您的團隊中可能有技術熟練的 mfc 開發人員,但如何達到加速 linu...
將應用程式移植到uCLinux下時需要注意的問題
將應用程式移植到uclinux下時,需要注意有以下限制 uclibc中不帶有pthread庫,要進行多執行緒程式設計,只能選擇select函式。uclinux系統中由於記憶體管理的問題,沒有fork 函式,用vfork 代替,即uclinux系統中沒有真正的fork,多程序實際是使用vfork實現的...
將 Win32 程式移植到 Linux
分類 c c c linux shell 2011 03 23 17 01 2899人閱讀 收藏舉報 linux windows 平台service 指令碼程式設計 對於這個問題,網上已經有很多資料給予了介紹,但是相比於這些資訊,本文立足於個人的實踐,將內容具體到開發環境和源 我覺得還是有很多值得總...