2011-09-12 30 views
0

我讀這個鏈接位域操作弊

http://dec.bournemouth.ac.uk/staff/awatson/micro/articles/9907feat2.htm

我無法理解從這個鏈接下面的語句,請幫助我瞭解這件事。

程序員只是寫一些宏來移位或屏蔽 相應的位以獲得所需的值。但是,如果數據涉及更長的二進制編碼記錄,則C API會遇到問題。多年來,我有 ,看到許多冗長,複雜的二進制記錄 與短或長整數位域定義設施。 C 將這些比特字段限制爲整數定義變量的子字段,其暗示了兩個限制:首先,該比特字段可能不是以比特爲單位擴大比基礎變量更寬;其次,沒有 位字段應該與基礎變量邊界重疊。複數 記錄通常由填充了位子字段定義的幾個連續的長整數 組成。

符合ANSI標準的編譯器可以自由地實行這些尺寸和對齊 限制,並規定,在依賴於實現的,但 可預測的方式,比特字段如何打包到底層機器 字結構。結構存儲器對齊通常不是便攜式的,但位域存儲器更不如此。

我從這些語句中理解的是,宏可以用來屏蔽左移位或右移位。但是我在腦海裏有這個疑問,爲什麼他們使用宏? - 我認爲,通過在宏中定義它,可以建立可移植性,而不管16位或32位操作系統。這是真的嗎?我無法理解上述語句中提到的兩個缺點.1位字段可能不會更寬2.no位字段應該重疊下層可變邊界

而行,

複雜記錄通常由填充比特的子場的定義幾個連續長整數 的。

+2

什麼,在你看來,是 「C API」?我在哪裏可以找到其中之一? –

+1

@Pete wilson:這些是來自上面的鏈接,我不明白的聲明! – Angus

+3

對!整個報價有些偏離目標並被誤導,或者可能只是表達不好。只要注意可移植性,因爲它涉及字的大小,你會沒事的。換句話說,不要對底層硬件的32位或64位或n位進行任何假設。相反,使用編譯器作者一直在爲您提供的標題。在這個問題的背景下,其中最重要的是limits.h。 –

回答

4

1.bit字段可能不寬

比方說,你想有一個位字段是200位長。

struct my_struct { 
    int my_field:200; /* Illegal! No integer type has 200 bits --> compile error! 
} v; 

2.no位字段應該重疊的基礎變量邊界

比方說,你想要兩個30位域和編譯器使用32位整數基礎變量。

struct my_struct { 
    unsigned int my_field1:30; 
    unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */ 
} v; 

通常遊戲,編譯器會自動添加填充,產生一個結構具有以下佈局:

struct my_struct { 
    unsigned int my_field1:30; 
    :2 /* padding added by the compiler */ 
    unsigned int my_field2:30; /* Without padding this field will overlap a 32-bit boundary */ 
    :2 /* padding added by the compiler */ 
} v;