亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么位Endianness是位域中的一個問題?

為什么位Endianness是位域中的一個問題?

C++ C
慕蓋茨4494581 2019-06-20 17:33:35
為什么位Endianness是位域中的一個問題?任何使用位字段的可移植代碼似乎都可以區分小平臺和大端平臺。見Linux內核中struct iphdr的聲明這類代碼的例子。我不明白為什么一點點迷戀是一個問題。據我所知,位字段是純粹的編譯器構造,用于方便位級操作。例如,考慮以下位域:struct ParsedInt {     unsigned int f1:1;     unsigned int f2:3;     unsigned int f3:4;};uint8_t i;struct ParsedInt *d = &i;在這里,寫作d->f2是一種簡潔易懂的表達方式(i>>1) &  (1<<4 - 1).但是,位操作是定義良好的,并且不管體系結構如何都能工作.那么,為什么位域不是可移植的呢?
查看完整描述

3 回答

?
墨色風雨

TA貢獻1853條經驗 獲得超6個贊

按照C標準,編譯器可以隨意地以任意方式存儲位字段。你可以的絕不可能對比特的分配位置做任何假設。下面是一些C標準沒有指定的與位字段相關的內容:

未指定行為

  • 分配給容納位字段的可尋址存儲單元的對齊(6.7.2.1)。

實現-定義的行為

  • 位字段是否可以跨越存儲單元邊界(6.7.2.1).
  • 單元內位字段的分配順序(6.7.2.1).

大/小終端當然也是實現定義的。這意味著您的結構可以按以下方式分配(假設16位INT):

PADDING : 8f1 : 1f2 : 3f3 : 4or

PADDING : 8f3 : 4f2 : 3f1 : 1or

f1 : 1f2 : 3f3 : 4PADDING : 8or

f3 : 4f2 : 3f1 : 1PADDING : 8

哪一個適用?猜一猜,或者深入閱讀編譯器的后端文檔。再加上32位整數的復雜性,以大數或小數表示,再加上這一點。然后添加一個事實,即編譯器可以添加任意數量的填充。字節在BIT字段中的任何位置,因為它被視為一個結構(它不能在結構的開頭添加填充,但可以添加其他任何地方)。

然后,我甚至沒有提到如果您使用普通的“int”作為位字段類型=實現定義的行為,或者使用(無符號)int=實現定義的行為以外的任何其他類型會發生什么。

因此,要回答這個問題,不存在可移植的位域代碼,因為C標準對于如何實現位字段非常模糊。唯一可以信任的位字段是布爾值塊,程序員不關心這些位在內存中的位置。

唯一的可移植解決方案是使用按位運算符而不是位字段。生成的機器代碼將完全相同,但具有確定性。在任何C編譯器上,任何系統的逐位操作符都是100%可移植的.


查看完整回答
反對 回復 2019-06-20
?
RISEBY

TA貢獻1856條經驗 獲得超5個贊

據我所知,位域純粹是編譯器構造。

這也是問題的一部分。如果位字段的使用僅限于編譯器“擁有”的內容,那么編譯器如何打包或排序位將幾乎與任何人無關。

然而,位字段可能更多地用于建模編譯器域-硬件寄存器、通信的“連線”協議或文件格式布局的外部結構。這些東西對如何布局比特有嚴格的要求,而使用位字段對其建模意味著您必須依賴于實現定義的,更糟糕的是編譯器將如何布局位字段的未指定的行為。

簡而言之,位字段的指定不夠好,不能使它們在最常用的情況下有用。


查看完整回答
反對 回復 2019-06-20
?
大話西游666

TA貢獻1817條經驗 獲得超14個贊

ISO/IEC 9899: 6.7.2.1 / 10

實現可以分配任何足夠大的可尋址存儲單元,以容納位?LD。如果有足夠的空間,結構中緊接著另一位的位?LD應被封裝在同一單元的相鄰位中。如果不存在?-?空間,則將不適合的位-?LD放入下一個單元或重疊相鄰單元是實現-de?Ned。在一個單元內(從高階到低階或低階到高階)位?屏蔽的分配順序是實現-de?ned??蓪ぶ反鎯卧膶R是?編輯的。

在試圖編寫可移植代碼時,使用位移位操作而不是對位字段的排序或對齊做任何假設是更安全的,而不考慮系統的endianness或Bitness。

亦見EXP11-C.不要將期望一種類型的運算符應用于不兼容類型的數據。


查看完整回答
反對 回復 2019-06-20
  • 3 回答
  • 0 關注
  • 631 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號