結構中的位元欄 — (Bits Field) 讓您為每個位元取名字
為了展示 C 語言中位元欄位的用途,筆者將拙著《系統程式》中 CPU0 處理器的狀態暫存器 (Status Word) 拿來做為範例,該狀態暫存器的位元配置如下圖所示。
圖一、CPU0 的狀態暫存器 (SW) 之位元配置
程式範例:結構中的位元欄位
#include <stdio.h>
// 請注意,寫在前面的欄位會被編在低位元部份,因此通常我們必須倒著寫,也就是將圖從右看到左。
typedef struct
{
unsigned lo:4; // 像是 unsigned hi, lo:4;
unsigned hi:4; // 請注意,不能把兩個欄位寫在同一行
} byte;
typedef struct
{
unsigned m:1;
unsigned b2:5;
unsigned t:1;
unsigned i:1;
unsigned b1:20;
unsigned v:1;
unsigned c:1;
unsigned z:1;
unsigned n:1;
} StatusWord;
int main() {
byte b = { .hi=0x0F, .lo=0x0C };
unsigned char *bp = (unsigned char*) &b;
printf("byte=%02x\n", *bp);
StatusWord sw = { .n=1,.z=0,.c=1,.v=0,.i=1,.t=1,.m=0,.b1=0,.b2=0 };
unsigned int *psw = (unsigned int*) &sw;
printf("SW=%08x\n", *psw);
}
執行結果
D:\cp>gcc structBits.c -o structBits
D:\cp>structBits
byte=fc
SW=a00000c0