當前位置:首頁 » 編程語言 » c語言計算共同體長度
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言計算共同體長度

發布時間: 2022-06-30 20:31:28

c語言中共用體變數所佔內存長度等於

C語言中共用體變數所佔內存長度等於其中長度最長的那個成員的長度

❷ C語言共同體問題

結果應該是輸出一個隨機數!有這樣幾個概念關於共用體,也就是你說的共同體:1、共用體是幾種不同的變數存放在同一內存當中,即在內存中占同一位置2、同一內存段可以用來存放幾種不同類型的成員,但是在每一瞬只能放其中的一種,而不是同時存放幾種類型。也就是每一瞬只有一個成員起作用!3、共用體變數中起作用的成員是最後一次存放的成員。根據以上原則來看你這道題:#include "stdio.h"union un{int i;char c[2];} //共用體變數定義完成後應當以分號結束,此處應該加一個分號main(){union un x; //定義共用體變數xx.c[0]=10; //字元數組第一個字元位置存放整型10,字元變數和整型變數可以相互轉換x.c[1]=1; //字元數組第二個字元位置存放整型1//至此,共用體變數x.c成員被賦值,其中x.c[0]==10,x.c[1]==1,而x.i不起作用printf("\n%d",x.i); //因為x.i沒有被賦值,所以它的值由內存自動分配,所以會產生隨機數}

❸ C語言細節:共用體的位元組長度問題

union 里的成員 共享 內存。
哪個成員 長度最長,內存大小就 用它決定。
另外,編譯器考慮「內存對齊」,32位機上考慮 按32 位對齊,也就是 4 位元組 對齊。
需要的最大長度不為4 的整數 倍數 時,給它分配 多1個或2個或3個位元組,湊成4 的整數 倍數。

int a; 需內存大小 sizeof(int)
char b[x]; 需內存大小 x * sizeof(char).
M1 = sizeof(int);
M2 = x * sizeof(char).
if (M2 > M1) M = M2; else M = M1;
if (M%4 != 0) M = (M / 4 + 1) * 4;
例如:
x=6; M1=sizeof(int)=4; M2= 6 * sizeof(char) = 6;
M=M2=6;
M%4 = 6%4 = 2; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (6/4+1) * 4 = 8.
結果 8。
例如:
x=7; M1=sizeof(int)=4; M2= 7 * sizeof(char) = 7;
M=M2=7;
M%4 = 7%4 = 3; 符合 if (M%4 != 0) M = (M / 4 + 1) * 4 = (7/4+1) * 4 = 8.
結果 8。
===========
sizeof(test)=4n // 必須 4 位元組 對齊, 所以必定是4的整倍數
4(n-1)<=x<=4n // x 的個數,當然 小於等於 總位元組數4n, 大於等於 4n-4 個位元組數。

❹ C語言中聯合體是什麼樣的與結構體不一樣吧還有運算符的目數怎麼計算

共用體
構造數據類型,也叫聯合體
用途:使幾個不同類型的變數共佔一段內存(相互覆蓋)

結構體是一種構造數據類型
用途:把不同類型的數據組合成一個整體-------自定義數據類型

---------------------------------------------------------------

結構體變數所佔內存長度是各成員占的內存長度的總和。

共同體變數所佔內存長度是各最長的成員占的內存長度。

共同體每次只能存放哪個的一種!!

共同體變數中起作用的成員是尊後一次存放的成員,
在存入新的成員後原有的成員失去了作用!

---------------------------------------------------------------

Structure 與 Union主要有以下區別:

1. struct和union都是由多個不同的數據類型成員組成, 但在任何同一時刻, union中只存放了一個被選中的成員, 而struct的所有成員都存在。在struct中,各成員都佔有自己的內存空間,它們是同時存在的。一個struct變數的總長度等於所有成員長度之和。在Union中,所有成員不能同時佔用它的內存空間,它們不能同時存在。Union變數的長度等於最長的成員的長度。

2. 對於union的不同成員賦值, 將會對其它成員重寫, 原來成員的值就不存在了, 而對於struct的不同成員賦值是互不影響的。

舉一個例子:

例:

#include <stdio.h>

void main()
{
union{ /*定義一個聯合*/
int i;
struct{ /*在聯合中定義一個結構*/
char first;
char second;
}half;
}number;
number.i=0x4241; /*聯合成員賦值*/
printf("%c%c\n", number.half.first, number.half.second);
number.half.first='a'; /*聯合中結構成員賦值*/
number.half.second='b';
printf("%x\n", number.i);
}

輸出結果為:
AB
6261

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

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

❻ 關於c語言共用體的問題

int型的變數佔2個位元組,而一個內存單元只有一個位元組的大小,因此int型變數要分開放。


那怎麼放呢?是這樣的,先把int變數分成兩個位元組,前八位作為高位元組,後八位作為低位元組,這樣,把高位元組的那八位放在低地址內存單元,低位元組的那八位放在高地址內存單元。

而long型的佔四個位元組,也是一樣的,分成四個位元組分開放,高位元組放低地址內存單元。


你的程序中,只佔一個位元組的0x39給了int型的i[0],那這樣,高位元組為0,假設放在最低地址的內存單元中,那0x39就順著往上放,i[1]也一樣。好了,這樣放完後,這個佔四個位元組的共用體變數的存儲情況就是:0x38/0x00/0x39/0x00(說明:左手邊為高地址,右手邊為低地址)。

i[1]i[0]

好了,我們現在是取long型的k,那很顯然,低地址的存儲單元是它的高位元組,高地址的存儲單元是它的低位元組,這樣就得到:0x00390038。

這是我用keil-C51模擬得到的結果,如果你問為什麼結果跟你的不一樣,那我只能回答:系統決定變數的存放方式。

❼ C語言的結構體和共同體的區別是什麼

結構體(structure)是一種構造類型,它是由若干「成員」組成的。每一個成員可以是一個基本數據類型或者又是一個構造類型,而且每個成員的數據類型可以相同也可以不相同。共同體(union)將幾種不同的變數儲存在同一內存單元中,也就是使用覆蓋技術,幾個變數互相覆蓋,這種幾個不同的變數共同佔用一段內存的結構,可見二者最大的區別就是所佔用的內存,結構體(structure)所佔用的內存是分量內存之和,共同體(union)所佔用的內存是等於最大的分量的內存。
具體來說,結構體(structure)與共同體(union)主要有以下區別:
1.結構體(structure)與共同體(union)都是由多個不同的數據類型成員組成,
但在任何同一時刻,
共同體(union)中只存放了一個被選中的成員,
而結構體(structure)的所有成員都存在。在結構體(structure)中,各成員都佔有自己的內存空間,它們是同時存在的。一個結構體(structure)變數的總長度等於所有成員長度之和。在共同體(union)中,所有成員不能同時佔用它的內存空間,它們不能同時存在。共同體(union)變數的長度等於最長的成員的長度。
2.
對於共同體(union)的不同成員賦值,
將會對其它成員重寫,
原來成員的值就不存在了,
而對於結構體(structure)的不同成員賦值是互不影響的。

❽ 請問C語言高手:關於一個共用體的問題!

1.共用體表示幾個變數共用一個內存位置,在不同的時間保存不同的數據類型和不同長度的變數。在union中,所有的共用體成員共用一個空間,並且同一時間只能儲存其中一個成員變數的值。
2.當一個共用體被聲明時, 編譯程序自動地產生一個變數, 其長度(以位元組byte為單位,一個byte是8個二進制位)為聯合中最長的數據類型長度的整數倍,例如
union foo
{
char s[10];
int i;
};
在這個union中,foo的內存空間的長度為12,是int型的3倍,而並不是數組的長度10。若把int改為double,則foo的內存空間為16,是double型的兩倍。
3.綜上可知,你定義共同體實際在內存中分配的空間是4個byte,因為long數據類型長度是4個byte,而char 字元型數據類型是一個byte,實際在內存中分配的空間示意圖
0000 0000(4,最高位)
0000 0000(3)
0000 0000(2)
0000 0000(第一個byte,最低位)

4.於是s->i[0]=0x39;,實際佔用的是第一個和第二個byte,實際存放方式是:
0 x (2)(16進制,一個字元需要四個2進制位,這個地方有點忘了具體怎麼轉換的了)
0010 0111(1),
s->i[1]=0x38;佔用第三個和第四個個byte,實際存放方式是:
0 x (4),
0010 0110(3),
,於是,最後輸出結果是39,因為s->c[0]指向第一個BYTE(字元型char只佔一個byte)
5.如果對共同體還不是很了解,你可以看一下

❾ C語言共用體

int和char佔用的位元組數跟編譯器有關,可以用sizeof()查看。

這里假設int佔4個位元組,char佔1個位元組,共用體變數a的內存分布如下圖所示:

因此,如果之前未對i賦值,那列印i的值實際上就是列印二進制(xxxxxxxxch[1]ch[0])數對應的十進制數。xxxx表示該位元組的數是不確定的。當xxxx是0的時候,則i=(0000000C),對應的十進制數就是13。