私は次のコードを持っています:
void main()
{
char tmp[3]= "AB";
short k;
memcpy(&k,tmp,2);
printf("%x\n", k);
}
ASCIIでは、char'A'の16進値は41で、char'B'の16進値は42です。このプログラム4241の結果はなぜですか。正しい結果は4142だと思います。
明らかに、最下位バイトが最初に来る「リトルエンディアン」マシンでこれを実行しています。http://en.wikipedia.org/wiki/Endiannessを参照してください。
プラットフォームは、数値の下位バイトを小さいメモリ アドレスに格納し、上位バイトを上位メモリ アドレスに格納します。このようなプラットフォームは、リトルエンディアンプラットフォームと呼ばれます。
ただし、数値を印刷する場合は、上位の桁が最初に印刷され、下位の桁が後で印刷されます (これが、私たちの日常の数値表記のしくみです)。このため、リトルエンディアン プラットフォームでメモリに格納される方法と比較すると、結果は「逆」に見えます。
ビッグエンディアンプラットフォームで同じプログラムをコンパイルして実行すると、出力は次のようになります4142
(2 バイトのプラットフォームを想定short
)。
PS One は、この場合の「問題」は、私たちの日常の数値表記の「奇妙さ」であると主張できます。数字の意味が右から左の方向に大きくなるように数字を書きます。これは、左から右の方向に読み書きする社会の文脈では矛盾しているように見えます。つまり、リトルエンディアン メモリでは反転されません。それは逆の数字の書き方です。
あなたのシステムはリトルエンディアンです。つまり、short
(16 ビット整数) は最下位バイトが最初に格納され、その後に最上位バイトが続きます。
同じことがより大きな整数にも当てはまります。次のコードは「44434241」になります。
void main()
{
char tmp[5]= "ABCD";
int k;
memcpy(&k,tmp,4);
printf("%x\n", k);
}