所以。我正在嘗試將 uint16_t(16 位元組 int)轉換為類。獲取類成員變數。但它沒有按預期作業。
class test{
public:
uint8_t m_pcp : 3; // Defining max size as 3 bytes
bool m_dei : 1;
uint16_t m_vid : 12; // Defining max size as 12 bytes
public:
test(uint16_t vid, uint8_t pcp=0, bool dei=0) {
m_vid = vid;
m_pcp = pcp;
m_dei = dei;
}
};
int main() {
uint16_t tci = 65535;
test t = (test)tci;
cout<<"pcp: "<<t.m_pcp<<" dei: "<<t.m_dei<<" vid "<<t.m_vid<<"\n";
return 0;
}
預期輸出:
pcp:1 dei: 1 vid 4095
實際輸出:
pcp: dei: 0 vid 4095
還,
cout<<sizeof(t)
回傳 2。不應該是 4 嗎?
難道我做錯了什么?
uj5u.com熱心網友回復:
test t = (test)tci;
此行不會執行您期望的強制轉換(這將是 a reinterpret_cast,但它不會編譯)。它只是使用默認值呼叫您的建構式。Som_vid被65535截斷為 12 位,并且m_pcp和m_dei被分配0. 嘗試洗掉建構式以查看它是否無法編譯。
我知道做你想做的唯一方法是撰寫一個正確的建構式,如下所示:
test(uint16_t i) {
m_vid = i & 0x0fff;
i >>= 12;
m_dei = i & 0x1;
i >>= 1;
m_pcp = i & 0x7;
}
演示
另外我不確定你為什么期望m_pcp為 1,因為 65535 的 3 個最高位為 7。
另外,
cout<<sizeof(t)回傳 2。不應該是 4 嗎?
不,3 1 12=16 位構成 2 個位元組。
uj5u.com熱心網友回復:
您的位域總共有 16 位,因此 2 個位元組的大小是正確的。(編譯器會將相鄰的位域打包在一起——但要小心,因為可能因編譯器而異)您在單個 uint16_t 值上的建構式僅將值的 12 位分配給 m_vid 并將 0 分配給其他成員。65535 的前 12 位是 4095,因此輸出正確,如您所記(注意:您對位域是位元組的注釋應該讀為“位”),但您對其他位的期望是關閉的。建構式明確表示,如果未指定,則為它們提供 0 值。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/521496.html
下一篇:屬性縮放例外
