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 位系統上
知乎不支持插入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編程語言 |