關於c語言程式的共用體問題,請進

時間 2022-08-23 08:55:06

1樓:

共用體中的不同變數起始位址都是相同的。就是說它們只是同一單元的不同別名而已。

共用體的大小由成員中最大的那個成員決定,i和i分別佔兩個位元組,long佔4個位元組c-c分別佔乙個位元組,也就是說i相當於c和c,i相當於c和c,s->c[0]相當於s->i[0],s->c[2]相當於s->i[1],所以結果是39,要想輸出38,需要輸出改為s->c[2]

2樓:匿名使用者

共同體中各個成員是共享記憶體空間的,這個題的答案並不唯一的,是看具體平台的。

在win32平台上,該共同體占用4bytes,表示如下

-1- -2- -3- -4-

這4個byte,i[0] 使用的 1和2兩個byte,而i[1]使用的是 3和4.

c[0]用的是1號,c[1]用2號,依次類推。

為i[0]賦值為0x39時,1號和2號記憶體存什麼內容呢?因為下面要取的是c[0]。

這就要知道平台是存數是高位在前還是低位在前了。

intel平台高位在前,所以會得到0x39,但是amd平台是相反的,所以得到0.

3樓:匿名使用者

去看一下公用體的定義吧,感覺樓主的邏輯很亂,這個應該是記憶體強制轉換的問題,你理解了公用體真正的定義就能明白了,否則很難解釋

c語言共用體問題

4樓:大維

計算機儲存的時候是把! 高位存在高位址 地位存在低位址! k占用兩個位元組,k的高位對應的就是共用體陣列i的i[1],低位對應的就是i[0]

5樓:

圖上已經畫的很明白了啊,這個共用體是個兩位元組的物件,前乙個位元組是0x02,後乙個位元組是0x00,所以在printf的時候,先按照短整型取出資料0x0002(注意x86架構是小端模式,低位元組在前),再promote成為整型0x00000002,最後輸出的結果是2。

好好學習天天向上

6樓:自我程式設計

共用體,就是成員變數共用記憶體位址。

這裡記憶體低位址(r.i[0]),高位址(r.i[1]),分別儲存十進位制數2和0。在記憶體中以2進製儲存,就分別是:

00000010和00000000。

當大端模式,高位資料在低位址,r.k讀取的數字就是00000010,00000000,也就是十進位制的512。

當小端模式,高位資料在高位址,r.k讀取的數字就是00000000,00000010,也就是十進位制的2。

所以你圖中結果,是因為你電腦是小端模式。

7樓:匿名使用者

低位先存 低位為2高位為0值為z

8樓:匿名使用者

x86短整兩位元組,高位元組在後。

則00000000 00000010(2)=2(10)如果交換r.i[0]=0,r.i[1]=2,則00000010 00000000(2)=512(10)

c語言共用體輸出問題

9樓:匿名使用者

#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語言公共用體問題

10樓:

共用體的成員變數都是有效的,你可以直接引用它們但是注意,因為它們是共用乙個位址,所以你直接引用,會得到你不想要的結果

union

例如上面,你先賦值了c,後賦值了a,但是a的值會把c的值覆蓋,所以使用的時候要注意

11樓:洪興

定義在進行某些演算法的c語言程式設計的時候,

需要使幾種不同型別的變數存放到同一段記憶體單元中。也就是使用覆蓋技術,幾個變數互相覆蓋。這種幾個不同的變數共同占用一段記憶體的結構,在c語言中,被稱為「共用體」型別結構,簡稱共用體。

注:在某些書籍中可能稱之為「聯合體」,但是「共用體」更能反映該型別在記憶體的特點。

一般定義形式union 共用體名變數表列

關於c語言共用體的問題

12樓:金色潛鳥

共同體(聯合體)的特點是所有成員變數共享同一塊記憶體單元。

另外(1)當各成員長度不相等 時,記憶體塊的大小由 最長的決定。-- 你的幾個成員長度相等,無此問題。

(2)資料存放時涉及位元組次序,分大端序和小端序。windows 用小端序。

小端序:

i[2] 的 排列 是 i[0] 2位元組,i[1] 下面的2位元組

i[0] 裡2個位元組 低位元組在前,高位元組在後 0x0039 排列成 0x39 0x00

i[1] 裡2個位元組 低位元組在前,高位元組在後 0x0038 排列成 0x38 0x00

於是4個位元組內容 是 0x39 0x00 0x38 0x00

翻譯成 long int k:

k 的4位元組 排列 是:最低位元組,低位元組,高位元組,最高位元組 (0x39 0x00 0x38 0x00)

輸出資料時要拼成:最高位元組 高位元組 低位元組 最低位元組 也就是 0x00 0x38 0x00 0x39

輸出為 0x00380039 (輸出格式 0x%08x)

或 380039 (輸出格式 %x)

大端序從略。

13樓:匿名使用者

共用體是構造資料型別,也叫聯合體

它使幾個不同型別的變數共佔一段記憶體(相互覆蓋),每次只有乙個能使用.

結構體則不然, 每個成員都會有儲存空間的,可以一起用.

32位作業系統下 short int佔2位元組,int佔4位元組,38=1個位元組, 00=2個位元組,39=1個位元組;

為什麼先輸出38然後39呢,因為資料儲存在遵循了 先進後出原則,這涉及到共用體型別資料的儲存。這裡不能長篇大論了。

所以呢,s->k讀取的是 陣列i[2]位址的資料

14樓:匿名使用者

16進製制39,38化成二進位制就是111001和111000因為short int 2位元組就是16位,所以兩個都要在前面補0,每個都要夠16位

得到0000000000111001和0000000000111000

連起來就是00000000001110010000000000111000

然後你會發現這就是16進製制的380039

c語言共用體問題

15樓:匿名使用者

選擇c:公用體所佔的記憶體的長度是其成員型別的最大長度,此記憶體某一時刻只能存放一種資料,結構體內可以有公用體,公用體內也可以有結構體。

16樓:驕陽似火任響

其實這個方法,也不是沒人想到過,可是能不借助地球上的知識想到這個辦法的,都是

c語言中有關共用體的問題和意義

17樓:匿名使用者

公用體不適合你這種類似的需要有「記憶」的場景,如果要用,也是類似於資料塊前面有個資料頭,這樣整個資料塊和資料頭公用。另外,公用體通常有額外的資訊,指示當前資料型別是什麼。

18樓:匿名使用者

共用體在一次應用時只能n選1

19樓:

我真心沒懂...到底要幹什麼,乙個變數被你翻來覆去的修改了...你還想要以前儲存的...你到底要幹嘛,這跟共用體有什麼關係啊...

關於乙個c語言共用體賦值問題

20樓:以辰良況樹

首先:在我們常用的系統中,存放的變數經常是從右向左存放的.

比如你定義了c1和c2

那麼在計算機記憶體是這樣的順序:

c2,c1

你的共用體好像有個問題,我沒發現x的定義

不過我假設你的x是個int,那麼x與c2,c1共用同一塊記憶體,這就是共用體的意思

當你給x賦值,也是給c2,c1賦值,

並且0x12放到了c2的位置,34放到了c1位置所以,就產生了你所說的結果

21樓:匿名使用者

這一點教科書說的是對的

只有成員c值是可確定的,其餘成員的值在不同的編譯器,不同的編譯選項下結果可能不同

主要是位元組序的問題,也就是使用大端模式還是小端模式的問題

22樓:餘士恩終辰

首先,你第三行落了乙個分號;

其次,c語言多次賦值是允許的,但重複定義是不允許的。

char

a='a';//定義了a,且賦了初值『a』

char

a='b';//重複定義了a

最後,你想多次賦值時不需要加上型別修飾符,那樣是定義變數。

例如定義a,並賦初值'a',第二次賦值'b',覆蓋其初值char

a='a';//定義了a,且賦了初值『a』;

a='b';//再次給a賦值'b',覆蓋了它的初值'a';

c語言共用體的問題

23樓:滴冰的水

1全部您好,chang.a=16961; 在記憶體中儲存的值對應的十六進製制是:4241

由於是a處於聯合中,所以char c[2];的起式位址跟chang.a是相同的。

在根據在記憶體中儲存的高=低位關係,就很容易理解了。

chang.c[0] 對應的位址就是 41 所在的記憶體位址,chang.c[1]對應的就是42 對應的記憶體位址。

經過printf輸出,41轉換為十進位制是 65,對應的字元是 a42 對應的十進位制是66,對應的字母是b

不懂可以繼續問我

24樓:正常人1號

因為我們知道共用體是公用記憶體的,char佔乙個位元組,short佔兩個位元組

16961=(01000010 01000001)原碼16961補碼為65536-16961=48575=10111101 10111111;

所以前乙個位元組裡的內容為66, 對應ascii碼為『b』;

後乙個位元組裡的內容為65,對應ascii碼為『a』。

從閣下的結果來看,記憶體中的內容不一定是以補碼形式存放。

25樓:匿名使用者

你應該考慮將數轉成16進製制,取低位元組

關於C語言幾個程式的問題

第一個程式 修改兩處 include void main int qh int x,int y 第二個程式 修改4處 include include void main else if d 0 注意這裡 else 第一個 下面幾行格式控制有誤 scanf f l 輸入變數 printf 請輸入出發時...

關於C語言程式的幾個問題,關於C語言的一個問題

1.1 沒有 因為 a 0 為假,如果你看過 c陷阱與缺陷 就該知道 與 具有短路現象 即如果邏輯運算子 前半個表示式的值可以決定整個表示式的真假,那麼就不會運算判斷後半個表示式 例 int a 100 3 2 a 5 10 因為3 2為真,可以決定整個表示式的值為真了,已經沒必要判斷後面的真假了,...

C語言程式問題

x 1是賦值語句,結果為1,永遠為真。所以此迴圈為死迴圈。會一直執行的。你好,對於你的補充,我回答下 while n 它的判斷條件知道是什麼吧?裡面的n為真時,執行迴圈,為假時,退出迴圈。其實,它等價於while n 0 對於這道題,while x 1 也就等價於while x 1 0 x 1是賦值...