長度(單位bit)
c type
32位64位
char88
short
1616
int32
32long
3264
long long
6464
float
3232
double
6464
指標 (*)
3264
主要的不同點在於long和指標,這兩種型別都由32bit變為64bit。
同樣需要注意的有:在c語言中,函式在呼叫之前可能沒有宣告。-time_t時間型別,因為其在linux平台中的定義為typedef long time_t;
- 結構體包含long或者指標成員的,其結構體大小也會有變化。
如果沒有宣告,那麼編譯器會自動按照一種隱式宣告的規則。
下面是乙個例子:
#include
int main(int argc, char** argv)
warning: implicit declaration of function 『hello』先看第一句警告warning: implicit declaration of function 『hello』,warning: assignment makes pointer from interger without a cast
該警告資訊產生的原因是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,然後各個變數按照上面的原則進行排列即可,基本的原則就是把結構中的變數按照型別大小從小到大宣告,儘量減少中間的填補空...