64 bit Linux下程式開發注意事項

2021-09-29 16:58:59 字數 2806 閱讀 3464

本文**liweiwei的部落格

1、 32 位和 64 位c資料型別大小

32和64位c語言內建資料型別,如下表所示。

上表中第一行的大寫字母和數字含義如下所示:

i表示:int型別

l表示:long型別

p表示:pointer指標型別

32表示:32位系統

64表示64位系統

如:lp64表示,在64位系統下的long型別和pointer型別長度為64位。

64位linux 使用了 lp64 標準,即:long型別和pointer型別長度為64位,其他型別的長度和32位系統下相同型別的長度相同,32位和64位下型別的長度比較見上圖的藍色部分。

下圖為在32和64位linux系統下使用sizeof檢測出的資料型別的長度。

32位平台下結果:

64位平台下結果:

2、 64系統下開發注意事項

2.1 格式化字串:long使用%ld,指標使用%p,例如:

char

*ptr =

&something;

printf (

%x\n", ptr)

;

上面的**在 64 位系統上不正確,只顯示低 4 位元組的內容。正確的方法是:使用 %p

char

*ptr =

&something;

printf (

%p\n", ptr)

;

2.2 數字常量:常量要加l例1,常數 0xffffffff 是乙個有符號的 long 型別。在 32 位系統上,這會將所有位都置位(每位全為 1),但是在 64 位系統上,只有低 32 位被置位了,結果是這個值是 0x00000000ffffffff

例2,在下面的**中,a 的最大值可以是 31。這是因為 1 << a 是 int 型別的。

long l =

1<< a;

要在 64 位系統上進行位移,應使用 1l,如下所示:

long l =

1l<< a;

2.3 符號擴充套件:避免有符號數與無符號數運算,例如:

int i =-2

;unsigned

int j =1;

long l = i + j;

printf

("answer: %ld\n"

,l);

32位下是-1,在64位下是4294967295。原因在於表示式(i+j)是乙個unsigned int

表示式,但把它賦值給k時,符號位沒有被擴充套件。要解決這個問題,兩端的運算元只要均為signed或均為unsigned就可。

2.4 轉換截斷

轉換截斷發生在把long轉換成int時,如下例:

int length =

(int

)strlen

(str)

;

strlen返回size_t(它在lp64中是unsigned long),當賦值給乙個int時,截斷是必然發生的。而通常,截斷只會在str的長度大於2gb時才會發生,這種情況在程式中一般不會出現。雖然如此,也應該盡量使用適當的多型型別(如size_t、uintptr_t等等)。

2.5 賦值,

不要交換使用 int 和 long 型別,例如:

int i;

time_t l;

i = l;

不要使用 int 型別來儲存指標,例如:

unsigned

int i,

*ptr;

i =(

unsigned

) ptr;

不要使用指標來存放 int 型別的值。例如:

int

*ptr;

int i;

ptr =

(int

*) i;

2.6 移植倒64位環境下的效能移植到64位平台後,效能實際上降低了。原因是64位中的指標長度和資料大小有關,並由此引發的快取命中率降低、資料對齊等問題。通過改變結構中資料排列的先後順序,會因為少了填充資料,儲存空間也隨之減少。如:

2.7 程式中鏈結到的庫要使用64位的庫。

由上可見所有的問題都是由long和指標長度改變引起,在開發過程中只有牢記long和指標型別的長度

Linux下程式開發

在unix中編寫新程式的一種最簡單的方法就是,以現有的程式為起點,並對其進行修改,編寫使用手冊也是一樣。如果在某個程式中發現了漏洞並進行了修補,給程式的作者傳送乙個補丁比僅僅給出 對補丁的描述要更容易,更準確,也更有禮貌 diff file1.c file2.c diffs 區別,產生補丁 patc...

在64位linux下編譯32位程式

一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系統在效能和...

在64位linux下編譯32位程式

留存備份 一般情況下我們最好是在乙個平台上編譯本平台的二進位制程式,比如在32位平台上編譯32位程式而在64位平台上編譯64位程式。現在64位的系統 這裡主要指x86 64系統,包括amd64和intel的em64t 已經開始廣泛的使用起來了,甚至於你現在要是想買32位的處理器根本就沒有。64位的系...