第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

為什么位Endianness是位域中的一個(gè)問題?

為什么位Endianness是位域中的一個(gè)問題?

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

3 回答

?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

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

未指定行為

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

實(shí)現(xiàn)-定義的行為

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

大/小終端當(dāng)然也是實(shí)現(xiàn)定義的。這意味著您的結(jié)構(gòu)可以按以下方式分配(假設(shè)16位INT):

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

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

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

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

哪一個(gè)適用?猜一猜,或者深入閱讀編譯器的后端文檔。再加上32位整數(shù)的復(fù)雜性,以大數(shù)或小數(shù)表示,再加上這一點(diǎn)。然后添加一個(gè)事實(shí),即編譯器可以添加任意數(shù)量的填充。字節(jié)在BIT字段中的任何位置,因?yàn)樗灰暈橐粋€(gè)結(jié)構(gòu)(它不能在結(jié)構(gòu)的開頭添加填充,但可以添加其他任何地方)。

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

因此,要回答這個(gè)問題,不存在可移植的位域代碼,因?yàn)镃標(biāo)準(zhǔn)對于如何實(shí)現(xiàn)位字段非常模糊。唯一可以信任的位字段是布爾值塊,程序員不關(guān)心這些位在內(nèi)存中的位置。

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


查看完整回答
反對 回復(fù) 2019-06-20
?
RISEBY

TA貢獻(xiàn)1856條經(jīng)驗(yàn) 獲得超5個(gè)贊

據(jù)我所知,位域純粹是編譯器構(gòu)造。

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

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

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


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

TA貢獻(xiàn)1817條經(jīng)驗(yàn) 獲得超14個(gè)贊

ISO/IEC 9899: 6.7.2.1 / 10

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

在試圖編寫可移植代碼時(shí),使用位移位操作而不是對位字段的排序或?qū)R做任何假設(shè)是更安全的,而不考慮系統(tǒng)的endianness或Bitness。

亦見EXP11-C.不要將期望一種類型的運(yùn)算符應(yīng)用于不兼容類型的數(shù)據(jù)。


查看完整回答
反對 回復(fù) 2019-06-20
  • 3 回答
  • 0 關(guān)注
  • 606 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號