今天一個(gè)讀者朋友給我發(fā)的一段代碼,這段代碼讓他有了疑惑。
代碼如下:
#include “stdio.h”int main()
{
typedef union{
short i;
char j[2];
}DATA;
DATA a;
a.j[0] = 10;
a.j[1] = 1;
printf(“%x
”,a.i);
return 0;
}
這里說一個(gè)問題,我們從printf上看到的不一定我們想看到的,所以我們需要去變量的內(nèi)存地址一探究竟,一定要了解內(nèi)存的布局,對內(nèi)存有所了解。
上面注釋的代碼,在我的電腦中運(yùn)行的結(jié)果不相同,所以要看printf的準(zhǔn)確輸出,應(yīng)該初始化變量a。
使用gdb來查看地址,可以準(zhǔn)確看到變量內(nèi)存中的數(shù)據(jù)。
什么是大小端?
這個(gè)問題在之前的文章說過,這里再重新提一下
大端模式(Big-endian),是指數(shù)據(jù)的高字節(jié),保存在內(nèi)存的低地址中,而數(shù)據(jù)的低字節(jié),保存在內(nèi)存的高地址中
小端模式(Little-endian),是指數(shù)據(jù)的高字節(jié)保存在內(nèi)存的高地址中,而數(shù)據(jù)的低字節(jié)保存在內(nèi)存的低地址中
我們用這個(gè)再來看看我們的程序
#include “stdio.h”int main()
{
typedef union{
short i;
char j[2];
}DATA;
DATA a;
//a.j[0] = 10;
a.j[1] = 1;
printf(“%x
”,a.i);
return 0;
}
j[0]在低地址,j[1]在高地址,這個(gè)沒有什么意見吧?
內(nèi)存就是一個(gè)尺子,它是不斷變長的,所以這個(gè)地址也是慢慢變大的,沒有任何問題吧。
然后,我們可以看看現(xiàn)在的輸出,從上面的輸出可以看到輸出100,也就是j[1]在高地址,j[0]在低地址,那這個(gè)計(jì)算機(jī)就是小端模式。
也可以通過查看內(nèi)存地址來確認(rèn)
責(zé)任編輯:haq
-
C語言
+關(guān)注
關(guān)注
180文章
7605瀏覽量
137000 -
代碼
+關(guān)注
關(guān)注
30文章
4791瀏覽量
68694
原文標(biāo)題:C 語言,使用 union 了解內(nèi)存
文章出處:【微信號:LinuxHub,微信公眾號:Linux愛好者】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論