C 語言結構中的位元欄位

高等 C 語言

簡介

字串

指標與陣列

函數

結構

物件導向

記憶體

檔案

錯誤處理

巨集處理

C 與組合語言

資料結構

動態字串

動態陣列

鏈結串列

雜湊表

開發環境

Make

Cygwin

MinGW

DevC++

wxDevC++

編譯器

gcc 編譯器

TinyCC 編譯器

LCC 編譯器

應用主題

CGI 程式

GNU 程式

視窗程式

影像處理

練習題

訊息

相關網站

參考文獻

最新修改

簡體版

English

為了展示 C 語言中位元欄位的用途,筆者將拙著《系統程式》中 CPU0 處理器的狀態暫存器 (Status Word) 拿來做為範例,該狀態暫存器的位元配置如下圖所示。

Cpu0StatusWord.jpg

圖一、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

Facebook

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-NonCommercial-ShareAlike 3.0 License