c語言共同體問題,C語言共同體問題

時間 2022-02-01 20:03:08

1樓:周強劉梅

x 要先初始化一下 x.i=0;

這樣輸出的結果為 266 ! 共用體裡的變數記憶體址址是一樣的!佔用的位元組數為變數中的最大位元組的,這裡有 int i 的大小 也就是 4個位元組

x.c[0]=10; 也就是第一個位元組變為 00001010x.c[1]=1; 也就是第二個 000000001因為我們前面有x.

i=0;所以第三位元組為00000000 第四位元組為000000000

因為 window要是小端系統,所以 低位在低位元組,所以int i 的記憶體為 00000000 00000000 00000001 00001010 也就是10進位制的266

2樓:

這和大小端模式有關係,如果是小端模式,輸出為0x0000010a,即266,如果是大端模式,輸出為0x0a010000,即167837696,但因為i佔4個位元組,而c佔2個位元組,其餘2個位元組的內容是未知的,所以輸出不一定正確,可以將c定義為4個位元組,將其餘2個位元組置為0

union un x;

x.c[0] = 10;

x.c[1] = 1;

x.c[2] = 0;

x.c[3] = 0;

printf("%d",x.i);

3樓:匿名使用者

樓上回答的都非常準確, 在 x初始後,x.i的值為266 。否則的話,輸出的值是不確定的,每臺計算機上的輸出都不同。

原因是由於 union un x 分配在棧中的資料 是個不確定的值。 該棧的記憶體地址所對應的資料 是上次其他程式所使用後遺留下的資料。

但是唯一肯定的是,就像tidecao2006 所說的:「x的低2個位元組一定是,00001010和00000001」 這是因為 你對 sizeof(union un)的記憶體空間的低2個位元組的空間 分別設定了10(00001010)與1(00000001),高2個位元組 是 上次其他程式所使用後遺留下的資料。

所以最終記憶體的資料是這樣的(x86)。按位元組(高->低) |unkown|unkown|00001010|00000001

4樓:匿名使用者

答案是不確定的,但是唯一肯定的是,x的低2個位元組一定是,00001010和00000001,x的低2個位元組和c是公用一個空間的,因此修改c也就修改了x低2個位元組

5樓:匿名使用者

輸出結果是隨機數,因為整數i並沒有賦值,預設情況下c編譯器為它指定一個隨機數。

c語言共同體問題

6樓:匿名使用者

1.共用體表示幾個變數共用一個記憶體位置,在不同的時間儲存不同的資料型別和不同長度的變數。在union中,所有的共用體成員共用一個空間,並且同一時間只能儲存其中一個成員變數的值。

2.當一個共用體被宣告時, 編譯程式自動地產生一個變數, 其長度(以位元組byte為單位,一個byte是8個二進位制位)為聯合中最長的資料型別長度的整數倍,例如

union foo

;在這個union中,foo的記憶體空間的長度為12,是int型的3倍,而並不是陣列的長度10。若把int改為double,則foo的記憶體空間為16,是double型的兩倍。

3.綜上可知,你定義的chang實際在記憶體中分配的空間是2個byte,因為short資料型別長度是4個byte,而char 字元型資料型別是一個byte。chang實際在記憶體中分配的空間示意圖

0000 0000(2,高位)

0000 0000(1,低位)

chang.a=16961;在記憶體中的實際儲存是

0100 0010(2,高位,數值為66,字元表示大寫b)

0100 0001(1,地位,數值為65,字元表示大寫a)

4.於是chang.c[0],實際佔用的是第一個byte(低位),chang.c[1]佔用第二個byte(高位),

5.如果對共同體還不是很瞭解,你可以看一下

7樓:

首先共同體 un 是兩個位元組的,因為 char c[2] 是兩個位元組,short 也是兩個位元組的,去佔用空間最大的型別,因此是兩個位元組。

chang.a=16961,也就是 chang.a=0x4241。

存入 chang 的兩個位元組中的話,低位元組儲存 0x41(65,'a'),高位元組儲存 0x42(66,'b')。

chang.c[0] 取得的是 chang 的低位元組,chang.c[1] 取得是chang的高位元組。

c語言,關於共同體的問題

8樓:匿名使用者

1。區域性變數是不會初始化為0的;

2。共同體的意思是裡面的元素(或說欄位)它們公用同一記憶體,一個更改了,另外的也會被更改;當你輸入x的時候,由於輸入的是很小的數,在低位元組裡,其他的(除了符號位)為0,float低位元組為指數位,他的資料位在高位元組中,是0,所以y是0;反過來輸入y,int x就會變成一個很大的數,因為高位元組有資料。

9樓:

恩,考慮一下int和float同一記憶體空間

c語言共同體問題

10樓:匿名使用者

16位機器int型資料佔兩個位元組,所以可以和兩個字元型資料構成union

int值為0x4321,高位元組放0x43,低位元組放0x21

11樓:匿名使用者

union是聯合體,int和char陣列共用儲存空間,都是佔2個位元組,字元陣列是順著放由低位元組向高位元組放,而int是作為一個整體儲存,因此int的低位在高位元組,高位在低位元組,於是char裡面的數字反過來了(另外,表示16進位制是用0x不是ox)

12樓:匿名使用者

union所佔的記憶體空間等於它的所有成員中最「大」的一個所佔的空間。

16位機器中int佔16位,char佔8位,因此int與char[2]正好同樣佔16位。

對於機器處理整數的方法,一般有大尾序、小尾序和機器序三種做法,而c對int的一般做法是大尾序,也就是說每八位為一段,按從低位到高位,放到記憶體當中。因此0x4321在記憶體中按照0x21、0x43的次序來儲存。

把s當作char陣列來讀取的時候,編譯器找到指向s最開頭的資料,然後按每八位為一個元素來讀取。很顯然,s.ch[0]所指向的值應該是0x21,s.

ch[1]向指向的值應該是0x43。

c語言共同體問題

13樓:龔煒林

首先這個是共用體,所以各個變數公用一段記憶體,你s->i[0]=0x39;s->i[1]=0x38;賦值以後,對應的該段記憶體最後佔8個位元組(兩個int,根據編譯器來確定)的區域被賦值,char型佔一個位元組,你輸出c[0],也就是第一個位元組的資料被輸出。而整形資料佔的4個位元組,在儲存時是低位在前的,比如0x11121314.在儲存時會被先讀取0x14放在第一個位元組0x13第二個位元組,依次下去,所以0x39相當於在前四個位元組的地址中存為0x39,0x00,0x00,0x00.

這樣你讀取第一個位元組的時候就是0x39了。

14樓:匿名使用者

union r,*s=&r;定義了此共同體,它的大小為此共同體內佔位元組最大的為此共同體大小。

其次,共同體是共享記憶體的使用方式,所以你在共同體內不管怎麼賦值,都會給其他的資料賦值。

15樓:匿名使用者

答案是0x39 ,我就奇怪了 樓主 不喜歡初始化,這樣是個很危險的習慣。不對記憶體進行memset ,會導致 程式的結果千奇百怪。 我看了你2個提問關於共同體的都是有不初始化的習慣。

c語言,共同體的三個問題,希望大神,詳細回答,感謝大神。。。。

16樓:慕容冰綃

共同體就是大家共用一塊記憶體,記憶體大小就是以成員中佔位元組數最多的那個成員為準,但是並不是被位元組數最多的那個成員佔去了,而是大家共用的,也就是誰都可以賦值。就比如你給的例子中,如果int a賦值了,那麼4個位元組就都有值了,比如賦值為0x12345678,那麼佔據了4個位元組,這時候如果你再給c[0]賦值'a',則『a'對應的資料就會佔據int a的4個位元組中的最低位,因為』a『對應的十六進位制的值為41,所以現在那4個位元組的值就變成了0x12345641。理解了儲存共享方式,後面的應該也就明白了吧,不懂再問

17樓:

1樓回答得挺好的,樓主可以去看看微機原理啊!就知道怎麼回事了

2023年哪共同體合併為歐洲共同體

1965年4月,西歐六國簽定了 布魯塞爾條約 決定將歐洲煤鋼共同體 歐洲經濟共同體和歐洲原子能共同體3個機構合併,統稱歐洲共同體或歐洲共同市場。1967年7月,條約正式生效,歐洲共同體正式成立。 歐洲經濟共同體 歐洲煤鋼聯營和歐洲原子能聯營 歐盟早期是由哪三個組織構成? 歐盟的前身是 歐洲共同體 e...

利益共同體是什麼意思,共同體什麼意思?

耐撕 利益共同體是讓守業者和創業者成為利益共同體,使用股權激勵方式,讓經理人關心股東利益,使經理人和股東的利益追求儘可能趨於一致。讓經理人在一定時期內持有股權,享受股權的增值收益,並在一定程度上承擔風險。這樣能使經理人在經營過程中更多地關心公司的長期價值。經邦的理解是,股權激勵對防止經理的短期行為,...

什麼是 人類生命共同體 ,生命共同體是什麼意思?

黨的十九大指出,人與自然是生命共同體,人類必須尊重自然 順應自然 保護自然。人與自然是生命共同體 的理念告訴我們,生態環境是人類生存最為基礎的條件,是我國持續發展最為重要的基礎。堅持 人與自然是生命共同體 的理念,以對人民群眾 對子孫後代高度負責的態度和責任,加快建設生態文明的現代化中國,推動人與自...