我陷入了一個試圖將一些變量打包成一個變量8字節長的陷阱。C++將不同的數據類型打包成一個長變量
基本上,我有幾個小的二進制大小的項目,我需要把它們放在一起發送到必須能夠解壓縮的類中。
所以,我提出以下幾點:
typedef unsigned long long PACKAGE; // 8 byte (shows as _int64 in debug)
(sizeof returns '8')
unsigned int dat1 = 25; // 1 byte long max
unsigned int dat2 = 1; // 4 bit long max
unsigned int dat3 = 100; // 2 byte long max
unsigned int dat4 = 200; // 4 byte long max
unsigned int dat5 = 2; // 4 bit long max
然後我做封裝類型的變量,它是空的(0)
PACKAGE pack = 0;
我想拋出使用二進制操作變量成包,我這樣做:
pack = (dat1 << 56) | (dat2 << 52) | (dat3 << 36) | (dat4 << 4) | dat5;
它的工作只有一半好,我計算,我必須得到包的十進制值等於2526526262902525058
,或
0010001100010000000001100100000000000000000000000000110010000010
二進制,但是istead我得到588254914
,或 00100011000100000000111011000010
二進制 這是某種正確的在它的尾巴和頭,但中間部分地方缺少了。
當這樣做時,我仍然想要以某種方式提取數據。
什麼,確切地說,你的問題是? –
你可以使用'uint64_t'和一個位域結構的聯合?雖然打字就像打破了嚴格的走樣規則。 –
一個由56個位置移動的int變量隱含地只將它移動了24個位置,這就解釋了爲什麼得到錯誤的答案。這是假設一個int是4個字節... – Madhusudhan