を理解できないコードは次のとおりです。は、任意のヘルプはここで素晴らしい:)</p> <p>だろう、私は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
前に定義されている場合
1は、組合は
############ #############
# # # #
# 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 #
##############
ので(globle_page
前に定義されてlocal_addr
)状況1で、g_pointer
の値chages、local_addr
のMSBまたはLSBあまりにも変更されます場合は、しかし、なぜ実際にそれを追加していますか?私のプラットフォームがビッグエンディアンのバイトオーダーであることを知っているので、local_addr
のMSBを変更する必要があります。なぜLSBが変更されるのですか?
globle_page
が
local_addr
前に定義された)、私は、
g_pointer
余りに1を加算の値が1、および `globle_pageの対応するアドレスを追加する"ことを説明することができますではなくので、状況1の
、私はのかなりわからないんだけどこの。
ここで起こっていることの正確な答えを誰にでも教えてもらえますか?質問を適切に記述しなかった場合、私の貧しい人の英語のことをお詫びします。
btw、私が使用しているプラットフォームはバイト整列の問題がありません。したがって、sturctはバイトごとに書かれたレイアウトです。
よろしく、 盛ユン
問題はどこですか?ユニオンは要件ごとにLSBで整列されているため、一方に '1'を追加すると' 1'が他にも追加されます。構造体のメンバのアライメントは実際には実装固有ですが、コンパイラは明白なことをしました2番目の例の 'unsigned char'は実際に' unsigned char'と1の 'unsigned char'パディングを加えたものです。 – hroptatyr
標準的なリトルエンディアンのように見えます。あなたのプラットフォームは何ですか?ビッグエンディアンであることはどうやって分かりますか? –
@Banthar Doing Embedding Cのプログラミング、宇宙のコンパイラを使用して、使用しているマイクロチップのバイトオーダーがBig-Endianだと言われました – shengy