我一直在考慮在C-過程如下分配:位域和聯盟 - 意想不到的結果用C
我實現分配給解碼8字節長的長整型131809282883593如下:
#include <stdio.h>
#include <string.h>
struct Message {
unsigned int hour : 5;
unsigned int minutes : 6;
unsigned int seconds : 6;
unsigned int day : 5;
unsigned int month : 4;
unsigned int year : 12;
unsigned long long int code : 26;
}; // 64 bit in total
union Msgdecode {
long long int datablob;
struct Message elems;
};
int main(void) {
long long int datablob = 131809282883593;
union Msgdecode m;
m.datablob = datablob;
printf("%d:%d:%d %d.%d.%d code:%lu\n", m.elems.hour, m.elems.minutes,
m.elems.seconds, m.elems.day, m.elems.month, m.elems.year,(long unsigned int) m.elems.code);
union Msgdecode m2;
m2.elems.hour = 9;
m2.elems.minutes = 0;
m2.elems.seconds = 0;
m2.elems.day = 30;
m2.elems.month = 5;
m2.elems.year = 2017;
m2.elems.code = 4195376;
printf("m2.datablob: should: 131809282883593 is: %lld\n", m2.datablob); //WHY does m2.datablob != m.datablob?!
printf("m.datablob: should: 131809282883593 is: %lld\n", m.datablob);
printf("%d:%d:%d %d.%d.%d code:%lu\n", m2.elems.hour, m2.elems.minutes,
m2.elems.seconds, m2.elems.day, m2.elems.month, m2.elems.year, (long unsigned int) m2.elems.code);
}
..what給了我一個硬時間是輸出。目前解碼/編碼很好地工作。 9:0:0二零一七年五月三十零日和代碼4195376,預計,但在「datablob」的區別真的不是 - 我想不通爲什麼/它源於:
9:0:0 30.5.2017 code:4195376
m2.datablob: should: 131809282883593 is: 131810088189961
m.datablob: should: 131809282883593 is: 131809282883593
9:0:0 30.5.2017 code:4195376
正如你所看到的datablob是關閉到原來的 - 但不是原來的。我已經諮詢了一位C語言流利的同事 - 但我們無法弄清楚這種行爲的原因。
問:爲什麼斑點互相不同?
獎金-Q:當操作工會Msgdecode
包含另一個領域,奇怪的事情發生了:
union Msgdecode {
long long int datablob;
struct Message elems;
char bytes[8]; // added this
};
結果:
9:0:0 30.5.2017 code:0
m2.datablob: should: 131809282883593 is: 8662973939721
m.datablob: should: 131809282883593 is: 131809282883593
9:0:0 30.5.2017 code:4195376
PS:閱讀SO關於位域+聯盟問題給我的印象是他們相當不可靠。這可以說是普遍的嗎?
如果這是你的任務,這是一個可怕的。位場結構對其佈局幾乎沒有任何保證。使用輪班和掩蔽!並且不能保證你可以使用'int','unsigned int'和'_Bool' bitfleids之外的其他值。作爲旁註:您使用的任何類型都不會保證spicif表示或寬度!如果您需要固定寬度,請使用固定寬度類型! – Olaf
@Olaf這是我的任務。所以我最後的PS問題可以用'是'來回答。 :) – Gewure
是的,但我們不是一個輔導服務。通過該導師可以獲得一本好的C書,並根據書中的信息過濾課程材料。作爲一個旁註:讓我分開,我從來沒有給我的學生這樣的任務:與代碼:你會在我的過程中失敗。一些原因:見上文。 – Olaf