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

c語言共用器

發布時間: 2022-07-22 07:22:20

① 關於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語言中的共用體

我測試了一下
int為32bit
,long為32位
,char為8位機測試。
分析得出這樣的結果:

這正如共用結構體中
假如他們的共用首地址為0x10000000
那麼

地址
變數

0x10000000:
a[0]
如果執行語句
s.a[0]=0x39

0x10000004:
a[1]
相差4個位元組
那麼會產生如下變化:

0x10000000:
b
a[0]=0x39
b[0]=0x39
c[0]=0x39(
字元c[0]="9")

0x10000000:
c[0]
如果再執行語句
s.a[1]=0x38

0x10000001:
c[1]
那麼會產生如下變化:

0x10000002:
c[2]
a[1]=0x38

0x10000003:
c[3]
相差1個位元組

也即是地址0x10000000到0x10000003中的數據為0x00000039

也即是地址0x10000004到0x10000007中的數據為0x00000038

雖然是共用體,但是a
b
c同用了一個地址
如果對a賦值了也同時對b和c賦值
只是數據類型不同而已。

如果從地址上來分析
c如果定義的是c[8],那麼c[5]地址即為0x10000004
它的值就因該為0x38,因為和a[1]的地址相同。

查看b的是後可以直接用%d來查看
因為在本機上也是32bit和int相同

③ c語言 共用體

你這樣一說,都不敢回答了


首先,

unionun
{
inti;
charc[2];
};//分號不能省略

共用體 之所以叫共用體,就是是因為其元素會共同擁有一塊內存空間,對於其中一個成員的賦值,會影響到另一個成員。

10 對應十六進制:0x0A;

1 對應十六進制: 0x01;

在內存中,c[0]是低位,c[1]是高位,

所以:char c[] 數組在內存中存儲的值就是:0x010A;

也就是共用體 x 元素在內存中的值,

所以:i 的值就是0x010A; 轉為十進制 即,266。當然不同編譯器或不同電腦的結果是不一樣的

④ c語言中的共用體是什麼

所謂共用體類型是指將不同的數據項組織成一個整體,它們在內存中佔用同一段存儲單元。其定義形式為:
union 共用體名
{成員表列};

union data
{
int a ;
float b;
doublec;
chard;
}obj;
該形式定義了一個共用體數據類型union data ,定義了共用體數據類型變數obj。共用體數據類型與結構體在形式上非常相似,但其表示的含義及存儲是完全不同的。先讓我們看一個小例子。

union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
struct stud /*結構體* /
{
int a;
float b;
double c;
char d;
};
main( )
{
struct stud student;
printf("%d,%d",sizeof(struct stud),sizeof(union data));
}
運行程序輸出:
15,8
程序的輸出說明結構體類型所佔的內存空間為其各成員所佔存儲空間之和。而形同結構體的共用體類型實際佔用存儲空間為其最長的成員所佔的存儲空間。
對共用體的成員的引用與結構體成員的引用相同。但由於共用體各成員共用同一段內存空間,使用時,根據需要使用其中的某一個成員。從圖中特別說明了共用體的特點,方便程序設計人員在同一內存區對不同數據類型的交替使用,增加靈活性,節省內存。

可以引用共用體變數的成員,其用法與結構體完全相同。若定義共用體類型為:
union data /*共用體*/
{
int a;
float b;
double c;
char d;
}mm;
其成員引用為:mm.a,mm.b,mm.c,mm.d 但是要注意的是,不能同時引用四個成員,在某一時刻,只能使用其中之一的成員。

main( )
{
union data
{
int a;
float b;
double c;
char d;
}mm;
mm.a=6;
printf("%d\n",mm.a);
mm.c=67.2;
printf("%5.1lf\n", mm.c);
mm.d='W';
mm.b=34.2;
printf("%5.1f,%c\n",mm.b,mm.d);
}
運行程序輸出為:
6
6 7.2
3 4.2,=
程序最後一行的輸出是我們無法預料的。其原因是連續做mm.d='W';mm.b=34.2;兩個連續的賦值語句最終使共用體變數的成員mm.b所佔四位元組被寫入34.2,而寫入的字元被覆蓋了,輸出的字元變成了符號「 =」。事實上,字元的輸出是無法得知的,由寫入內存的數據決定。
例子雖然很簡單,但卻說明了共用體變數的正確用法。

⑤ C語言共用體是什麼

共同體指的是
long w;
float x;
int y;
char z;
這幾個變數用同一塊內存,內存大小取這幾個變數中的最大值
位元組 long int float char double

16位機 4 2 4 1 8

32位機 4 4 4 1 8

64位機 8 4 4 1 8
如果是32位機上面一個共同體變數佔4個位元組,如果是64位機,佔8個位元組
所以答案應該是3.1416

⑥ C語言共用體

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

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

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

⑦ C語言共用體問題

結果是A。
你定義了一個union類型的變數,名字是ts,大小為4個位元組;ts可以用來存放int類型和長度為2個位元組的char型數組,其實這個union ts類型在的時候只是在這兩個類型中選用一個,只是共用了同一塊內存地址,並且與它們聯系的都是這塊內存的首地址罷了。
你下面是給c[0]和c[1]分別賦值A和B,此時與變數i相聯系的數據應該是AB,而你在調用printf函數時,是以%c的格式輸出變數i裡面存的數據,所以只能輸出A。

⑧ C語言共用體……

union 數據類型是按其中某個數據元素的最大內存來分配的,此列中就是int 的大小 4個位元組。

雖然定義了 char ch[2],但是還是可以取得字元數組ch[2]後面的數據,c不檢測數組越界的,只是此時數組越界,是非法的數據而已,這相當於從數組的首地址 ch 開始往後面去數據,0,1,2,3分別賦值為2.1.0.0後,pw內存的分布為:0000 0000 0000 0000 0000 0001 0000 0010,結果也就是258了

驗證也是如此

⑨ c語言中什麼是共用體

共用體是一種特殊的結構變數,他的成員共用同一個內存空間,比如括弧所在的內容應該這樣輸入:
union abc
{
char[10] wu;
long xuehao;
};
因為wu和xuehao 是佔用同一段內存空間的,確切的說是他們的存放空間首地址相同,所以他們是無法單獨存在的,擁有這個共用體的結構只能擁有wu 或xuehao ,如果對wu賦值,再對xuehao賦值,xuehao覆蓋了wu,wu變為沒有意義的了,反之一樣,所以不可能同時出現