標籤:

C語言里64位程序long類型的變數 長度是4還是8?

我試著把C編譯器換成64位的, 然後寫了如下程序.

#include &

int main()

{

long a=1;

long long b=1;

int *p;

printf("%d",sizeof(a));

printf("%d",sizeof(b));

printf("%d",sizeof(p));

getchar();

return 0;

}

輸出

488

網上都說long 的長度在64位裡面是8, 而這裡輸出了4. 可是指針的長度確實是8, 這是為什麼?

環境是 Win10 64位+ Codeblocks 16.01 + x86_64-w64-mingw32-gcc-7.1.0.exe

other compiler options: -std=c11


C語言標準層面來說,沒有明確定義。只能確定sizeof(char) &<= sizeof(short) &<= sizeof(int) &<= sizeof(long) &<= sizeof(long long)。

從實現角度來說,64位Linux採用的是LP64模型,這意味著Long, Pointer都是8位元組。32位Linux採用的是ILP32模型,也就是Int Long Pointer均為4位元組。

參考:將 Linux 應用程序移植到 64 位系統上

egin{array}{c|c|c|c} mathrm{ILP32}mathrm{LP64}mathrm{LLP64}mathrm{ILP64}\ hline mathtt{char}8888\ mathtt{short}16161616\ mathtt{int}32323264\ mathtt{long}32643264\ mathtt{long long}64646464\ mathtt{void *}32646464\ end{array}

知乎不支持插入table,用LaTeX強行畫了個,將就看吧。(中途滑鼠戳外面關掉了居然不保存公式?)

補充:……沒仔細看題默認當Linux了,Windows下32位是ILP32(你猜是什麼意思),64位是LLP64。


https://en.m.wikipedia.org/wiki/64-bit_computing#64-bit_data_models

標準沒有規定 long 長度,這是編譯器和系統選擇的。


如果你想用確定長度的整數,請用int32_t,int64_t。

甚至int都不保證一定是32位的


不確定,可以變化,你的printf("%ld
", (long)x); 是移植的.


size()一下不就知道了?話說這種類型就盡量不要用了,浪費腦細胞,用size_t、int32_t、int64_t這種


請用stdint.h


所以你知道為啥 Github 上面那堆模擬器項目都用 int32_t、int64_t 了吧。


有幾種標準,lp64,llp64,ilp64。

lp64 long是8位元組,llp64是4位元組,ilp是8位元組,但是int在ilp64標準下面也是8位元組。

常見的一般是lp64。


當長度重要時,不要做任何假設,用sizeof


long和int一樣都是4,指針在64位裡面是8,long long才是int64類型的8


再補充

linux里確實是8位

補充:

這是你給我的其中一網頁的部分截圖,大概說了些原因吧

我感覺最主要的是c語言標準並沒有給每種數據類型確定大小,而是限制了一定的規則,只要符合這種規則,編譯器愛咋咋

所以我還是比較喜歡vc6的命名方式【__int64】,因為這個名確定了這個變數的具體大小【據說曾經微軟還搞過__int128】

========================================================

long還是4,longlong是8


推薦閱讀:

C++ 完全兼容 C 語言嗎?
C Primer Plus第五版的練習題答案能找到官方正版的嗎?
為什麼0取反再右移任意位得出數總是-1?
linux下面有哪些純c的項目值得一讀源代碼?最近對c語言比較感興趣,但是c++又不太深入?
關於c語言for循環的問題?

TAG:C編程語言 |