C語言下常用資料型別長度及結構體位元組對齊問題

2021-10-25 09:42:13 字數 1204 閱讀 4997

各平台使用的資料模型共分為五種,分別為lp32、ilp32、lp64、ilp64和llp64。其中,i->int,l->long,p->pointer,ll->long long,數字代表資料型別的位元組長度。例如:ilp32代表int、long和pointer的長度為32位(4位元組),llp64代表long long和pointer資料型別的長度為64位(8位元組)。

目前,unix系統(64位)使用的都是lp64模型,unix(32位)和windows(32位)都使用的ilp32模型,64位windows使用的是llp64模型。

總體上看,lp64,ilp64,llp64是64位平台上的資料模型,ilp32和lp32是32位平台上的資料模型。

不同平台下常用資料型別長度

lp32

ilp32

lp64

ilp64

llp64

char11

111short22

222int44

484long44

884long long88

888pointer44

888所有資料模型中,float為4位元組,double為8位元組。

指標型別儲存的是位址變數,32位系統的位址位數為32bits,則指標長度為4位元組,64位系統的位址位數為64bits,則指標長度為8位元組。指標與資料模型無關。

在計算機系統中,位元組對齊跟資料在記憶體中的儲存位置有關。如果乙個資料變數的儲存位址是其對應長度的整數倍,那麼該變數為自然對齊。例如:某個整型變數的儲存位址為0x00000004,則該變數為自然對齊。下表展示了其他相關概念。

定義自身對齊值

作業系統中的資料型別的固定長度

指定對齊值

人為指定的對齊值,設定方法:#pragma pack(value)

有效對齊值

自身對齊值和指定對齊值中最小的那個

位元組對齊的根本原因是提高cpu訪問資料的效率。例如,處理器每次從儲存器中讀取四個位元組長度的資料,則當儲存位址是4的倍數時,整型資料一次儲存器操作就可以完成讀寫,否則我們需要兩次儲存器操作才能完成任務。總之,位元組對齊使得讀寫次數最少,從而提高資料訪問效率。

對於標準的資料型別,只要保證儲存位址是其長度的整數倍即可。

對於結構體資料,其內部的所有資料型別都需要對齊。

對齊規則:

對於結構體中的成員變數,當不滿足對齊規則時,需要在其前面填充一些位元組保證當前成員是位元組對齊的。

c語言之資料型別長度

c語言之資料型別長度 分享 2011 05 30 20 57 青雲清 瀏覽 219072 次 急2011 05 30 21 04 提問者採納 不要誤人子弟啊 搞清楚再貼出來 追問 那你的答案是啥呢?追答 16位 2,4,4,8,1 32位4,4,4,8,1 二 資料型別對應位元組數 程式執行平台 不...

c語言資料型別位元組長度

short與long兩個限定符的引入可以為我們提供滿足實際需要的不同長度的整形數。int通常代表特定機器中證書的自然長度。short型別通常為16位,long型別通常為32位,int型別可以為16位或32位。各編譯器可以根據硬體特性自主選擇合適的型別長度,但要遵循下列限制 short與int型別至少...

C 資料型別長度問題

一 位元組和字長 位元組,八位就是乙個位元組,是固定概念。字長是指計算機一次能處理的二進位制資料的長度,是乙個非固定的概念。例如,8位計算機的字長為8,即乙個位元組,32位計算機的字長位32,即4個位元組,同理,64位計算機的字長為64,即8位元組。二 c 中的資料型別 1 字元型資料char,該型...