1樓:匿名使用者
我來解釋解釋吧
main()
a; a.k=-7;
//printf("%d,%d,%d\n",a.c[0],a.c[1],a.k);
} printf("%d,%d,%d\n",a.c[0],a.c[1],a.k);
當輸入-7,則-7,-1,-7
當輸入7,則 7,0,7
其實根本問題就是資料在計算機中的儲存問題。
首先共用體是共用記憶體的,即共用體中每個成員都有相同的首地址。
你可以把這句執行看一下:
共用體的長度是最長一個成員的長度,所以該共用體的長度sizeof(a)=sizeof(a.k)。
7的原碼是:00000000|八個0|八個0|00000111,
a.k=-7,記憶體模式是:11111111|八個1|八個1|11111001,
a.c[0]和其首地址相同,所以a.c[0]在記憶體中是11111001(一個位元組),
當以%d格式輸出時要進行符號擴充套件,擴充套件到4個位元組,所以和-7有相同的記憶體模式,所以輸出-7;
a.c[1]是八個1(一個位元組),當以%d格式輸出時也要進行符號擴充套件,擴充套件後與-1有相同的記憶體模式,所以輸出為-1。
當輸入是7時,是同樣的道理,你可以自己分析一下。
(符號擴充套件:當最高位是1時,全部以1填充,當最高位是0時,全部以0填充)
2樓:匿名使用者
讀出的是你給的地址後面的東西,並不是說你給了什麼形式的資料就輸出什麼的。而是你用什麼方式來輸出,printf就會將後面的對應的32位的內容輸出。並不好似你給個八位的位元組資料就只讀八位。
在我的機器上是:
37777777771,37777777777,37777777771
由於你是用八進位制輸出,所以它讀出時讀出範圍是%d的範圍,既輸出的是對應的十進位制的數,然後轉換為八進位制。這時涉及到內部惡儲存方法,所以有可能輸出的結果會不同。當你用printf("%c,%c,%d\n",a.
c[0],a.c[1],a.k);對應的輸出是:
?�,-7
我只知道這些了。希望能幫助你。
3樓:匿名使用者
關於這個問題我是這麼看的:首先共用體的長度是最長的那個成員的長度,對本題而言是2個位元組(整形)。共用體內儲存的是最後一次賦值的情況,當以八進位制形式輸出a.
c[0]時,由於a.c[0]指向的地址是共用體的首地址,而格式控制符o是以八進位制形式輸出整數,故而將其後二個位元組內容全部輸出了,即與a.k應是完全一樣的。
而a.c[1]是指向字串陣列的第二個元素,即-7的高八位,二進位制為11111111,而o格式控制符是輸出的八進位制整數形式,所缺的一個位元組內容,由系統在前面補充,為了保持值不變,後補的八位與符號位一致,都填1,於是成為1111111111111111,轉化為八進位制後為177777。
c語言中共用體的一道題
4樓:匿名使用者
這道題涉及到主機序(位元組序)和變數佔用的位元組數,小位元組序(little endian):低位放在低地址大位元組序(big endian):高位放在低地址int:4個位元組
那麼題中0x4142各位元組序的記憶體中存放情況:
little:| 0x42 | 0x41 | 0x00 | 0x00 |
big: | 0x00 | 0x00 | 0x41 | 0x42 |
結論:一般我們使用的pc主機序都是小位元組序的,所以我們可以得到g.s[0]等於0x42, g.s[1]等於0x41
c語言共用體的一道題
5樓:匿名使用者
首先,i 為4個位元組,ch[2]佔 2個位元組,i 的前2位元組即ch[2]的2個位元組,程式ch[0]=13,ch[1]=0,那麼i 的後2位元組未初始化,所以是隨機的,輸出來當然就不是13了,如果要輸出13,即ch陣列定義為ch[4],然後ch[2] = ch[3] = 0,不過也不一定輸出就是13,與cpu的大小端模式有關
其次,如果你的**寫成a.i = 13,則a.ch[0]也不一定是13,這同樣與cpu的大小端模式有關,詳細可檢視網路
6樓:雋靖柔岑縱
z.i[0]
=0x39
賦值是十六進位制的
而共同體是佔用同一塊記憶體的
所以z.c也是等於0x39
所以轉換成十進位制是57
你輸出格式是字元型的
而字元的
『9』就是等於
十進位制的57
所以輸出9
7樓:匿名使用者
共用體只能使用其中一個成員,這裡既然初始化了char ch[2],那麼int i是一個未被初始化的變數,那麼i的值是隨機的,所以a.i不一定是a.0
8樓:記住一座城
vs2010執行結果是13,共用體變數a佔四個位元組,a.ch[0]=13,即低位元組是13,高位元組都為0,所以結果是13.
c語言,關於共用體的一個題。
9樓:匿名使用者
首先說一下她應該是對的
我覺得這個程式應該執行在16位系統上的
高地址存高位
r,k = 0x12345678;你再把r.i的幾個值打出來看看i[0] 0x78 i[1] 0x56 依此類推修改了一下試試看。
#include
main()r;
r.i[0]=2; r.i[1]=0;
r.i[2] = 0;r.i[3] = 0;
printf("%d \n",r.k);}
c語言共用體輸出問題
10樓:匿名使用者
#include
union
s;int main()
////
///聯合體又稱共用體,記憶體的最大空間是最大變數所佔的空間long 和int均佔四個位元組int a[2]佔8個位元組
//s.a[0]=0x39;///整個佔的空間應該是0x0039//s.a[1]=0x38;///整個佔的空間應該是0x0038//printf("%lx\n",s.
b);的時候是s.a[0]記憶體中的內容0x0039,因為是"%lx這種顯示方式所以為39
// printf("%c\n",s.c[0]);的時候是s.a[0]記憶體低地址一個位元組中的內容9 故顯示9
c語言共用體的一個問題
11樓:匿名使用者
首先 共用體 分配最大元素的記憶體 ,所以分配了8個位元組i[0]=0x39 所以前 4個位元組 是 0x00 0x00 0x00 0x39
後4個位元組 就是 0x00 0x00 0x00 0x39然後 輸出這個 共用體的 (c char[4] 4個位元組)前4個位元組的 低位元組 也就是0x00 0x00 0x00 0x39這段記憶體的 低位元組 也就是0x39 就是57
以字元的形式 輸出 57 對應的ascii 就是 9
12樓:我is林倩倩
十六進位制ox39代表字元9 s0就是字元9
c語言共用體型別變數在程式執行期間
13樓:匿名使用者
共用體中的成員共用同一塊記憶體
記憶體中儲存的內容是一定的,採用不同的成員變數進行資料引用,則會表現出不同的資料樣子
比如當呼叫 data1.b的時候 成員data1.a不依然在記憶體當中麼?
這時可以說data1.a存在,也可以說data1.a不存在,這好比一個人有兩個名字(大名,小名),你在使用大名時,如何確定小名不存在或存在呢? 所以這個問題問的很蛋疼
你能理解到上面我開始提到的意思就夠了,不要糾結這個題目了。
14樓:匿名使用者
值發生改變了就當然只有一個成員駐留了呀。
c語言共用體問題
15樓:大維
計算機儲存的時候是把! 高位存在高地址 地位存在低地址! k佔用兩個位元組,k的高位對應的就是共用體陣列i的i[1],低位對應的就是i[0]
16樓:
圖上已經畫的很明白了啊,這個共用體是個兩位元組的物件,前一個位元組是0x02,後一個位元組是0x00,所以在printf的時候,先按照短整型取出資料0x0002(注意x86架構是小端模式,低位元組在前),再promote成為整型0x00000002,最後輸出的結果是2。
好好學習天天向上
17樓:自我程式設計
共用體,就是成員變數共用記憶體地址。
這裡記憶體低地址(r.i[0]),高地址(r.i[1]),分別儲存十進位制數2和0。在記憶體中以2進位制儲存,就分別是:
00000010和00000000。
當大端模式,高位資料在低地址,r.k讀取的數字就是00000010,00000000,也就是十進位制的512。
當小端模式,高位資料在高地址,r.k讀取的數字就是00000000,00000010,也就是十進位制的2。
所以你圖中結果,是因為你電腦是小端模式。
18樓:匿名使用者
低位先存 低位為2高位為0值為z
19樓:匿名使用者
x86短整兩位元組,高位元組在後。
則00000000 00000010(2)=2(10)如果交換r.i[0]=0,r.i[1]=2,則00000010 00000000(2)=512(10)
求解一道c語言題,求解一道c語言題目 結構體的!!
因為p b,p指向的是fun 函式的中b陣列,而不是main 函式中的a陣列,所以不會修改a陣列的內容 如果這樣就會輸出abcde了 include void fun char p,int n int main 請注意fun 函式中的for迴圈頭部 for i 0,p b i 其中有p b,因此在迴...
C語言結構體的一道題,一道簡單的c語言結構體題
c c 加加作業有償待完成。一道簡單的c語言結構體題 include include define stunem 5 定義一個學生的成績表 typedef struct tagmember member 定義學生表 typedef struct tagtable table 獲取學生表中的學生指標 ...
c語言一道題,求解釋,一道C語言題,求解釋
輸入比如 13 4 15 6 12 這樣的加減法表示式並根據表示式計算結果 把輸入的字元轉化成int型 如果oldc為 則執行加法運算,否則執行減法運算 輸出sum 迴圈一直到輸入為 時結束 這個其實就是類似於簡單的 計算機 呵呵 一道c語言題,求解釋 題目輸出的是 指標所指的字串的長度。一共是10...