簡體   English   中英

字節序和大小為 1 的位域

[英]Endianness and bitfields of size 1

我認為字節序不應該影響最多 1 個字節的結構。 但這是我的小端機器上的代碼:

#include <iostream>
#include <bitset>
#include <cstdint>
#include <cstring>

using namespace std;

static_assert(sizeof(uint8_t) == 1, "Wrong uint8_t size");

struct Pieces {
    uint8_t flag : 1;
    uint8_t value : 7;
};

static_assert(sizeof(Pieces) == 1, "Something went wrong with Pieces size");

int main()
{
    uint8_t value = 0b10001111;
    Pieces pieces;
    std::memcpy(&pieces, &value, 1);

    cout << bitset<8>(value) << endl;
    // 10001111
    cout << bitset<1>(pieces.flag) << bitset<7>(pieces.value) << endl;
    // 11000111
    return 0;
}

結果不正確。 但是如果我改變了pieces結構中flagvalue成員的順序,那么結果是正確的。 但它不應該像我寫的那樣嗎? value的第一個(從左數起)位是標志。 它看起來像字節序問題,但字節序不是應該定義字節的順序,而不是位嗎?

有人可以向我解釋這里到底發生了什么嗎?

所以讓我從評論中收集所有信息。

似乎標准中沒有指定位字段的順序,因此取決於實現。 該標准的相關部分是(感謝@molbdnilo):

§9.6:“位域在某些機器上從右到左分配,在其他機器上從左到右分配。”

另外讓我注意其他評論。 似乎位域的順序在內存中只是顛倒了。 這似乎也與普通字段的順序一致,並且可能與字節序一致(如果有人可以在大字節序機器上檢查它,我將不勝感激)。

我想這就是“在某些機器上從右到左”和“在其他機器上從左到右”的意思。 然而,這是我的解釋,如前所述,我們不應該依賴它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM