Linux平台開發 64位與32位問題

2021-08-15 14:21:50 字數 2013 閱讀 3821

長度(單位bit)

c type

32位64位

char88

short

1616

int32

32long

3264

long long

6464

float

3232

double

6464

指標 (*)

3264

主要的不同點在於long指標,這兩種型別都由32bit變為64bit

同樣需要注意的有:

-time_t時間型別,因為其在linux平台中的定義為typedef long time_t;

- 結構體包含long或者指標成員的,其結構體大小也會有變化。

在c語言中,函式在呼叫之前可能沒有宣告。

如果沒有宣告,那麼編譯器會自動按照一種隱式宣告的規則。

下面是乙個例子:

#include 

int main(int argc, char** argv)

warning: implicit declaration of function 『hello』

warning: assignment makes pointer from interger without a cast

先看第一句警告warning: implicit declaration of function 『hello』

該警告資訊產生的原因是hello()函式被使用前沒有宣告,因此編譯器會輸出這個警告資訊。

出現這種情況後,編譯器會自動使用隱式宣告,相當於以下**

#include 

int hello();

int main(int argc, char** argv)

這個時候就可以解釋第二個警告資訊

warning: assignment makes pointer from interger without a cast

hello()函式按照隱式宣告,返回型別int給字元指標p,因此出現警告資訊。

當隱式宣告函式名稱恰好在鏈結庫中存在,編譯可以通過,

但是隱式宣告的函式實際返回並非都是int類,就會帶來隱患。

char *hello()int hello()為例,

返回值長度

32位64位

char *

3264

int3232

在32位平台,char *hello()返回乙個32位位址,隱式宣告為int hello(),返回值不變。

在64位平台,char *hello()返回乙個64位位址,隱式宣告為int hello(),返回值被強制轉換為32位。

因此返回指標型別的隱式宣告函式在32位平台仍然可以正常呼叫,但在64位平台會出現異常。

編譯**的時候加上-wall -werror這兩個引數,

-wall: 開啟所有警告資訊

-werror: 將所有警告資訊當作錯誤

64位平台轉32位平台總結

一般都是32位平台轉到64位平台,可是我們剛好相。我們公司最近做的分布式檔案系統,以前是在 64位平台下 以為現在的伺服器很少有 32位平台,也就沒有過多的考慮,現在由於客戶需要,不得不修改至 32位平台。現在總結如下,共大家學習。1 資料型別的定義 一般我們都用 typedef 定義資料型別 ty...

32位 64為平台之隨筆

關於vs32位和64位的問題,之前碰到過解決了,由於沒有及時記錄下來,現在給忘了,只留有當時和別人討論的只言片語,不管了,留下以供日後用到慢慢看吧。win7 64位它既有32位的執行環境又有64位的執行環境,並且vs是乙個32位的應用程式 如果程序是在32位環境載入的,dll也就在32位的clr上執...

64位與32位linux c開發時預設位元組對齊值

1 64位機器sizeof的值為16 struct a 2 32位機器sizeof的值為12 3 空間換時間 如果在程式設計的時候要考慮節約空間的話,那麼我們只需要假定結構的首位址是0,然後各個變數按照上面的原則進行排列即可,基本的原則就是把結構中的變數按照型別大小從小到大宣告,儘量減少中間的填補空...