我想這一段代碼就ideone.com,它完全符合,但我無法解釋發生了什麼,任何幫助將是巨大的:)無法理解這個聯盟
這裏是代碼:
#include <stdio.h>
typedef union {
unsigned char* g_pointer;
struct {
unsigned short local_addr;
unsigned char globle_page;
} g_l;
} Gld_WordType;
int main()
{
int Idx;
Gld_WordType test;
test.g_l.globle_page = 0x13;
test.g_l.local_addr = 0xfff0;
printf("g_pointer: %x\n
local_addr: %x\n
globle_page: %x\n",
test.g_pointer,
test.g_l.local_addr,
test.g_l.globle_page);
test.g_pointer++;
printf("g_pointer: %x\n
local_addr: %x\n
globle_page: %x\n",
test.g_pointer,
test.g_l.local_addr,
test.g_l.globle_page);
return 0;
}
結果是:
g_pointer: 13fff0
local_addr: fff0
globle_page: 13
g_pointer: 13fff1
local_addr: fff1
globle_page: 13
如果我簡單地切換的local_addr
和globle_page
的順序,結果證明是不同勢:
typedef union {
unsigned char* g_pointer;
struct {
unsigned char globle_page; // Changed order here.
unsigned short local_addr; // And here
} g_l;
} Gld_WordType;
這個時候,結果是:
g_pointer: fff00013
local_addr: fff0
globle_page: 13
g_pointer: fff00014
local_addr: fff0
globle_page: 14
OK,這是我這個問題的認識到現在,如果有任何故障,請指出來。
第一,工會在第一實施例由這樣的(這在在globle_page
前面local_addr
)
############ #############
# # # #
# g_pointer# # local_addr#
# # # MSB or LSB#
############ #############
#############
# #
# local_addr#
# MSB or LSB#
#############
##############
# #
# globle_page#
# #
##############
和佈局是這樣的,如果globle_page
被local_addr
前定義:
############ ##############
# # # #
# g_pointer# # globle_page#
# # # #
############ ##############
##############
# #
# local_addr #
# MSB or LSB #
##############
##############
# #
# local_addr #
# MSB or LSB #
##############
所以在情況1(local_addr
globle_page
前定義),如果g_pointer
的價值chages,local_addr
的MSB或LSB也可能發生變化,但爲什麼它實際上是增加一個嗎?因爲我知道我的平臺是Big-Endian字節順序,所以local_addr
的MSB應該改變,爲什麼LSB改變了?
的情況2(globle_page
local_addr
之前定義的),我可以解釋一下g_pointer
的值加一,而`globle_page的相應地址「添加一個過,但由於情況1,我不是很肯定的這個。
誰能告訴我這裏發生了什麼確切的答案?如果我沒有正確描述這個問題,對不起我英文不好。
順便說一句,我使用的平臺沒有字節對齊問題。所以結構是按照字節逐字節寫入的。
最好的問候, 盛來運
在哪裏的問題?根據需要,聯合是LSB對齊的,因此向其中的一個添加'1'也會將'1'添加到其他任何其他對象,結構成員的對齊方式實際上是特定於實現的,但編譯器選擇只是做明顯的事情就像你的圖片一樣,第二個例子中的'unsigned char'實際上是一個'unsigned char'加1'unsigned char'填充。 – hroptatyr 2012-03-09 10:52:31
它看起來像標準的小端行爲。你的平臺是什麼?你怎麼知道它是大端的? – 2012-03-09 10:52:47
@Banthar做Embingded C編程,使用宇宙編譯器,和我們使用的微芯片說它的字節順序是Big-Endian – shengy 2012-03-09 10:56:01