[英]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
結構中flag
和value
成員的順序,那么結果是正確的。 但它不應該像我寫的那樣嗎? 我value
的第一個(從左數起)位是標志。 它看起來像字節序問題,但字節序不是應該定義字節的順序,而不是位嗎?
有人可以向我解釋這里到底發生了什么嗎?
所以讓我從評論中收集所有信息。
似乎標准中沒有指定位字段的順序,因此取決於實現。 該標准的相關部分是(感謝@molbdnilo):
§9.6:“位域在某些機器上從右到左分配,在其他機器上從左到右分配。”
另外讓我注意其他評論。 似乎位域的順序在內存中只是顛倒了。 這似乎也與普通字段的順序一致,並且可能與字節序一致(如果有人可以在大字節序機器上檢查它,我將不勝感激)。
我想這就是“在某些機器上從右到左”和“在其他機器上從左到右”的意思。 然而,這是我的解釋,如前所述,我們不應該依賴它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.