關於union的c語言題目寫出下面程式正確的輸出結

2021-12-23 23:47:45 字數 5737 閱讀 2657

1樓:凌雲小紫冥

int和long一樣都是4個位元組,所以s->k取的就是i[0]的值。

printf("%c\n",s->c[0]) 算出是9和大小端有關,只有小端才是9。就是ansi char '9',換成十六進位制就是39。char[0]取了i[0]的低八位。

2樓:第一碗羊雜割

首先 union 和 struct 不同的一點就是一個 union 中的所有成員都是共用一個記憶體空間的,大小由成員中要求空間最大的來決定。也就是說你給其中一個成員賦值以後,其他成員就都是這個值,只不過因為成員型別不同導致這個值的表現不同。現在看這個程式,定義了一個 union

union  t;

所有成員的大小分別如下:

i: 2 * sizeof(int) = 2 * 4 = 8

k: sizeof(long) = 4

c: 4 * sizeof(char) = 4 * 1 = 4

可見最大的是那個整數陣列 i,佔 8 個位元組,所以這個 union t 的大小就是 8。

然後,你通過

s->i[0] = 0x39;

s->i[1] = 0x38;

給 i 陣列賦值,也就是 i 的前四個位元組儲存的是十六進位制整數 0×39,後四個位元組儲存的是十六進位制整數 0×38。因為 union 的所有成員共享一個記憶體空間,所以 k 和 c 的值同 i 的值是一樣的。然而 k 和 c 只有四個位元組的長度,所以後面的 0×38 就被忽略了,因為 0×39 已經佔據了前 4 個位元組。

也就是說,現在 k 的值是 0×39,c 的值也是 0×39。

然後看你的輸出

printf("%1x\n", s->k);

printf("%c\n", s->c[0]);

你要將 k 以十六進位制整數的方式輸出到螢幕上,c 以字元的方式輸出到螢幕上,也就是將 0×39 分別以十六進位制整數和字元的方式輸出到螢幕上。0×39 代表的十六進位制整數當然還是 39,而 0×39 所代表的字元是 '9'(注意這個 9 是字元而不是整數),這個你可以查一下 ascii 表看看十六進位制的 39 對應的字元是不是 '9'。所以輸出的結果自然就是 39 和 9 了。

下圖為 ascii 表的一部分,可見十進位制的 57,也就是十六進位制的 39 所代表的字元是 '9'。

為了更好理解 union,你也可以使用

printf("%c\n", s->c[4]);

列印出來 c[4],看看結果是不是 '8'。這是因為雖然定義 c 的長度是 4,但由於整個 union 在記憶體中的長度有 8,所以 c[4] 到 c[7] 這四個位元組在記憶體中仍然是存在的,而它的值就是剛才存在 i 中的第二個整數 0×38。然後因為十六進位制的 38 對應的字元是 '8'(見上圖),所以列印出 c[4] 的值是 8。

一點題外話是,包含系統標頭檔案時請使用

#include

而不是#include "stdio.h"

這樣會稍微提高執行效率。還有就是請讓 main 函式返回整數 0 而不是 void,返回 void 是不規範的寫法。

c語言題目:下面程式段的輸出結果是什麼? 15

3樓:匿名使用者

答案是0

int k沒有初始化,所以初始值不確定,但是int型別 4個位元組(範圍是-2147483648~2147483647). 所以在計算k的值時候,從起始地址往下數32位, 超出32位的會被截斷

如果是正數,那最後就是0,很直觀

如果是負數(8個位元組來看)

0xffffffffffffffff === -10xfffffffffffffffe === -20xffffffff80000000 === -21474836480xffffffff7fffffff === -2147483649但整型4個位元組,所以對於-2147483649,它計算0x7fffffff的大小,變成了2147483647,回到正數,最後為0

4樓:匿名使用者

如果正確答案是a;那麼那個老師是有問題的;c語言**現這種情況,答案是d才對

5樓:知道嗎

你沒賦值,預設數值為0 的

c語言題目(簡單),請問下面程式的輸出結果是什麼?

6樓:路之舞者

輸出15,*p的值就是變數i的值,最後和10相加後賦值給了i,就是15。

7樓:杯具——悲劇

這道題考察的是你把程式寫下來

當然你也可以直接問

但你要知道c語言是計算機啟蒙語言

c語言題目 讀程式,寫執行結果。下面程式的輸出結果是

8樓:時盼秋令祿

1,0,7

1,後++是先賦值再計算

前++是先計算再賦值

2.if中的||運算子,如果前面成立了,就不會再執行後面的了,(++i>0)成立了就不會再執行++j>0了

9樓:劉英博校一

1,0,7

首先++在左邊是先運算後取值

然後||

當其左邊為真時右邊表示式不運算,直接判真,所以++j沒有執行

10樓:喬晶晶牧暉

輸出1,0,7

因為++i的++在前,所以先累加1再取值,此時i=1,大於0條件滿足,||運算子後面的++j就不再計算,所以j=0,k++之後k=7所以輸出結果是1,0,7

c語言題:下面程式的輸出結果是:

11樓:c語言老年

答案是a,怎麼可能是b。第一次i是3,*p[i]就是s,第二次i是1,*p[i]就是o,答案是a

12樓:匿名使用者

正確答案選擇a:so

i=3時p[i]指向"sp"首字母,*p[i]取他的首字母的值輸出即是s

i--,i--得到i=1

i=1時p[i]指向「opk"的首字母,*p[i]取他的首字母的值輸出即是o

i--,i--得到i=-1,不滿足迴圈條件,跳出迴圈輸出回車

有個c語言題目,請大家幫幫忙,謝謝!!!!

13樓:◆江城子

0x12345678=0001 0010 0011 0100 0101 0110 0111 1000

按低位儲存,八位一個位元組,應該是b

14樓:匿名使用者

lz程式環境 tc下,

union

r, *s=&r;

一個聯合中的資料成員在記憶體中的儲存是互相重疊的,每個資料成員都在相同的記憶體地址開始。它們共享同一塊記憶體。union的長度為其內最長成員的長度,本題來說,在tc環境下是4個位元組。

並且聯合的儲存是:

低地址存高位位元組,高地址存低位地址。

0x12345678=0001 0010 0011 0100 0101 0110 0111 1000

八位一個位元組,剛好4個位元組。

按照儲存原則,在讀取這塊記憶體的時候,s->c[0]指向的地址塊的編碼實際上是 0111 1000 所以輸出 0x78;

假如輸出s->c[1]指向的是 0101 0110 輸出 0x56;

假如輸出s->i[0]指向的是 0101 0110 0111 1000 輸出5678;

假如輸出s->i[1]指向的是 0001 0010 0011 0100 輸出 1234;

環境是tc,如果在c++下面,鑑於現在的機器都是32位了,int變為了4個位元組,所以此時這個union的長度變為了8個位元組;

15樓:

在windoes下選b

其它的就可能不是這個答案了

主要是由機器存放位元組的順序來決定的

16樓:匿名使用者

~~~~~~~~~~

17樓:

答案是b,分析如下:聯合體r變數k是長整形佔32位4個位元組,最大數為+2147483647,s->k=0x12345678;給k附值,其中一個十六進位制數佔4位,因為儲存是從低位開始且一個位元組一個位元組,即78,56,34,12正好存滿。s->c[i]是以位元組為單位讀取,所以c[0]就是第一個位元組78,如果s->c[4]會輸出s->c[4]free;說前本人已在tc上驗證。

這種題在c二級上常見。 謝謝觀讀!!

18樓:匿名使用者

你定義的共用體型別union 包含3個成員變數,成員變數它們的起始地址都是相同的,成員變數不是順序的儲存,是疊放在一起的,其中i 陣列佔4個位元組,k 變數佔4個位元組,c陣列佔2個位元組,共用體型別的長度為最大成員所佔空間的長度4個位元組,定義的 r變數是共用體型別的變數,s是指向r變數的指標,執行s->k=0x12345678;是對r變數中的k 成員進行賦值,0x12345678的字首0x表示該資料是16進位制的資料,因此每兩個數就佔1個位元組,按照低位元組存在低地址原則,78應該存入r變數的第一個位元組,56存入第二個位元組,34存入第三個位元組,12就存入第四個位元組,printf(%x\n,s->c[0]);的含義是按16進位制形式輸出s->c[0]中的資料,也就是r變數中的第一個位元組,即78。故選 b.

19樓:匿名使用者

#include

main()

r,*s=&r;

s->k=0x12345678;

printf("%x\n",s->c[0]);

} //題目有點語法錯誤

資料在記憶體中是以二進位制儲存的

0x12345678儲存為

10010001101000101011001111000而c[0]正好指向r所佔記憶體的最後8位即01111000二進位制的01111000以16趕製輸出,結果就是78

20樓:飄渺世間天

看機器了,在我的機器上int和long一樣是32個位(bit),char是8個位,而聯合體中的儲存空間是依聯合中佔位最多的型別來決定其儲存空間的,該聯合中int[2]共佔64位,long佔32位,char[2]佔16位,int[2]是佔的最多的,所以這個聯合體佔用的記憶體就是64位,所有資料共用這一塊64bit的記憶體。

16位數的每一位數相當於2進位制的4個位,所以2位數就佔8位也就是一個位元組(byte)(12,34,56,78各佔一個位元組),所以當:

s->k = 0x12345678時,

這塊64bit的記憶體的內容就是 0x????????12345678,問號代表沒有用到的位元組。

由於一個char佔8位,也就是一個位元組,資料從低位向高位儲存,所以c[0]的內容就是0x78,c[1]的內容就是0x56,(i[0] = 12345678,i[1]內容不確定),所以這一句:

printf(「%x\n,s->c[0]);

就以16進位制的方式列印出了一第個8位儲存空間中的內容,也就是0x78,效果同:

printf("%x\n",s->i[0] << 24 >> 24);

21樓:匿名使用者

程式修改如下,就能按你的要求輸出!

你設定的聯合有4位元組長,所以要設定c[4],要輸出最高位,在第4位元組是c[3],否則不能顯示"12"

#include

main()

r, *s=&r;

s->k=0x12345678;

printf("%x\n",s->c[3]);

printf("%x\n",s->c[0]);

printf("%x\n",s->i[1]);

printf("%x\n",s->i[0]);}

C語言題目簡單的題目,C語言簡單題目

定義陣列,長度必須是個確定的值,char p n 這樣肯定不對 字元比較,不用strcmp,這個是比較字串的,只用用if p i a 這樣就可以了 str i 是個什麼?看不出來 要看區別直復 接,替換到語句中 制就明白了 1,設有一以下巨集定義 define width 80 define len...

c語言中 union的問題,int i賦初值,輸出k

int和long一樣都是4個位元組,所以s k取的就是i 0 的值。printf c n s c 0 算出是9和大小端有關,只有小端才是9。就是ansi char 9 換成十六進位制就是39。char 0 取了i 0 的低八位。大一c語言考試題 急 c語言中,浮點型別和整數型別的區別具體在哪些方面?...

c語言的題目

include void main else if scanf d b 成立繼續else if a 0 else a等於零結束 printf thank you for d d.a,b printf goodbye n 你的程式能執行啊!輸入的a 0時結束。很少 把 scanf 放 if 裡的 祝你...