一道C語言共用體程式題,C語言中共用體的一道題

2022-08-29 03:46:31 字數 4846 閱讀 2247

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...