1. 程式人生 > 實用技巧 >C語言位域的記憶體佈局

C語言位域的記憶體佈局

本文將先粗略介紹大小端,和大小端的測試方法,最後介紹位域的記憶體佈局。

1. 大小端

大端模式,是指資料的高位元組儲存在記憶體的低地址中,而資料的低位元組儲存在記憶體的高地址中。

小端模式,是指資料的高位元組儲存在記憶體的高地址中,而資料的低位元組儲存在記憶體的低地址中。

2. 大小端測試程式碼

#include <stdio.h>

unsigned char find_cpu_endian(void)
{ 
    int x=1;
    unsigned char cpu_endian = 0;

    if(*(char*)&x==1)
        cpu_endian
=1; //小端模式 else cpu_endian=2; //大端模式 return cpu_endian; } int main(){ printf("%d \n", find_cpu_endian()); return 0; }

3. 探究位域的記憶體佈局

先科普下共用體,這個在平常編碼用的也不多。

上實驗程式碼,我們通過實驗程式碼來理解位域的記憶體佈局。

union{ 
    struct {
        char i:1;
        char j:2; 
        char m:3
; }s; char ch; }r; int main(int argc, char argv[]) { r.s.i = 1; r.s.j = 2; r.s.m = 3; printf(" DEC:r.ch = %d , HEX:r.ch = 0x%x \n", r.ch, r.ch); printf("sizeof(r) = %ld \n", sizeof(r)); return 0; }

我們現在PC ubuntu 小端模式 的環境 上實驗:

root@lmw-virtual-machine:/home/lmw/桌面/C_Text# ./ab
 DEC:r.ch 
= 29 , HEX:r.ch = 0x1d sizeof(r) = 1 root@lmw-virtual-machine:/home/lmw/桌面/C_Text#

根據列印的0x1d,算出二進位制是 00011101 。我們畫出記憶體佈局:

我們常說的大小端,是以位元組為最小單位進行劃分的,組織各個位元組在記憶體上的佈局。
但是實測位域,一個位元組內的各個位域的記憶體佈局,也會受大端、小端不同平臺的影響。
小端模式下,遵循低地址儲存低bit的原則。

.