㈠ 關於c語言聯合體的問題
在VC6.0下運行,輸出的是266。
我覺得是這樣的:
union是所有的變數共用同一塊內存。其大小就是其包含的變數中最大的數據類型。
本題中應該是4B,也就是int的大小。
當執行a.x[0] = 10; a.x[1] = 1;時,存儲形式是000100001010(其長度應該是32,省略前面的0)
其中的0001就是a.x[0]中的十位數字1,一次類推。
當你輸出a.i時,程序就把000100001010當成int型輸出。
二進制的0000100001010就是266。
這是我根據答案推測的,不知道對不對。
㈡ c語言聯合體
union 在這個程序中取四個位元組
對:
s->i[0]=0x39;取前兩個位元組存儲
s->i[1]=0x38;取後兩個位元組存儲
而:
printf("%c\n",s->c[0]);則是取 「s->i[0]=0x39;取前兩個位元組存儲」 中的前一個位元組,又因為0X39的十進制為57(一個位元組最大數64),輸出的9的ascii碼正好小於64,所以輸出的數正好是9.
㈢ 關於c語言中聯合體/共用體中數據存放的問題
你好!!!
首先我們了解聯合體的所有成員是在內存中共享一塊內存的,在某一時刻只能有一個成員使用這個內存!!!
我們來看看一個例子:
#include <stdio.h>
union
{
int i;
char x[2];
}a;
void main()
{
a.x[0] = 10;
a.x[1] = 1;
printf("%d",a.i);
}
答案:266
解釋如下:
union
{
int i;
char x[2];
}a;
在聯合體a中定義了兩種數據類型,字元數組x以及整形變數i.其中整形變數是16位的,數組大小為2的字元數組為8X2=16位。如此一來,編譯器便會為聯合體a在內存中開辟一個16位的空間,這個空間里存儲聯合體的數據,但是這個空間只有16位,它既是整形變數的數據,也是字元數組的數據。如果你的程序從字元數組的角度解析這個空間,那麼它就是兩個字元,如果你的程序從整型的角度解析這個空間,那麼它就是一個整數。
以你的程序為例子,現在已經開辟了一個16位的空間,然後我們假定現在空間還沒有被賦值,為:
00000000 00000000
那麼在運行完代碼
a.x[0] = 10;
a.x[1] = 1;
之後,16位的空間變為:
00001010 00000001
然後程序運行
printf("%d",a.i);
就是把聯合體a當成一個整數來解析,而不是字元串數組。那麼這樣一來,程序就把這16位變成了一個完整的整數:
(00000001 00001010)二進制 = (266)十進制
注意,你可以看到程序在把16位弄成整數的時候把後面八位放在了前面,前面八位放在了後面。這個反序是計算機存儲結構造成的,這個和聯合體沒有直接關系。如果感興趣的話可以參考匯編語言。
現在我們來看看,你給的例子:
union dt
{
int a;
char b;
double c;
}data;
此時的聯合體所佔的內存大小是8個位元組,接下來執行:
data.a=5;
此此時內存中就不是空的了,也就不會是你說的是隨機數,
但是輸出:printf("%lf",data.c);結果是0.000000,這個結果我還不能給你准確的解釋。但是我可以肯定這與系統把double轉換成int 和int 轉化成 double 有關!!!
暫時我只能解釋這那多!!!
㈣ C語言有關共用體的使用方法,請前輩們請教謝謝啦!
共用體又稱聯合體,關鍵字union,正如其名字,其成員變數共同佔用同一段內存,這段內存的大小就是所有成員中最大的那個,所以整個共用體變數大小就是其最大成員大小,比如你代碼中的A大小就是成員c的大小8個位元組。
至於用處還是有很多的:
比如我們表示一個學生分數,有幼兒,小學,初中,這三種學生信息結構基本相同,但只有分數標准不一樣,幼兒分數(差、中、優),小學(C、B、A),初中(0~100分)。那麼我們就可以把學生信息定義成結構體,而結構成員分數那一塊定義成共用體(包含字元串類型,字元類型、數值類型)。這樣結構本身就不需要定義三種類型成員了。
又比如,數據傳遞時,用共用體表示數據,之後只要按照你的需求按不同格式獲取數據。
㈤ C語言聯合體存儲方法
這個和體系結構有關。首先int行具體是1個位元組還是2個位元組是不確定的。早期的編譯器來說。int是一位元組。但是現在的都是2位元組。因為計算機處理器一般都是32位處理器。
聯合只取最大的空間。比如。你定義的聯合體。int
A,char
B[2],其實在計算機裡面只佔用了2個位元組。你存儲char時,全佔了。當你存儲為int類型時候。要麼佔用一半的空間。要麼全部都佔用了。這個和計算機體系結構有關。但是a和b是不會同時存在的。聯合中的成員同時只能有一個。這個是和結構體區別的地方。如果還有疑問建議你去看看書吧。這個是基礎知識。
㈥ C語言的聯合體問題
union
{
int i;
struct
{
char first;
char second;
}half;
}number;
這裡面相當於兩個元素,一個元素int 佔四個位元組(早期是兩個位元組)
一個元素是結構體類型的佔有兩個位元組其中低八位是char first 高八位為char second;
這兩個元素公用一段內存空間,當你把i = 0x4241的時候i的內存表示形式為0x4241高八位為0x42而低八位為0x41而正好大寫字母A的ascall 值為0x41 而B為0x42
後面的也就類似這樣解釋。
樓主你其實可以把上面的
number.half.first='a';
number.half.second='b';試著只用一行語句而不兩行同時使用的結果。
比如把上面number.half.first='a'; 注釋掉,結果就變成了高八位為0x62 而低八位還是0x41
所以結果輸出就會改變為6241
㈦ c語言 聯合體問題
什麼數組啊!
人家是聯合體,是C裡面的一種數據類型
樓主,我個人認為,你這樣的用法是錯誤的。
雖然F9的時候沒有報錯
但我從來沒有見過有這么用(也可能是我忘了或本來就見識短)
#include
<stdio.h>
main(){
union{
int
a;
float
b;
char
c;
}x;
x.a=5;
printf("\n%d",x.a);
x.b=105.005;
printf("\n%f",x.b);
x.c='a';
printf("\n%c",x.c);
}
/******原來樓下的****/
由於在聯合體中的各變數內存地址相同,大小為最大的最大類型的長度。初始化5的數據直接儲存與該地址出,按照取值類型進行處理。然而,數據放入內存中的地址是低位元組在前面,而高位元組在後面,所有printf("\n%d",x.c);也輸出5,如果你使用超過一個位元組的數,如258,即
union{
int
a;
float
b;
char
c;
}x;
x.a=258;
printf("\n%d",x.c);
看看,結果就不一致了。
在存放數據的時候是按union里定義的數據類型存放的,讀取的時候也是按union里定義的類型進行讀取的,但輸出的表示形式卻是由printf("\n%d",x.c);
中的(%d)控制的。我們知道char類型的數據只佔一個位元組,所以讀出時也只讀一個位元組的長度,當所放的數據大於一個位元組的時候它會捨去一個位元組的數據,在用%d輸出的時候就會比你原來的int型數據要小256(一個位元組能表示的最大整數)——這就是結果不一至的原因。
還有一個值得重視的是,
x.b=105.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
和
x.b=1305.005;
printf("\n%f",x.b);
x.c=25;
printf("\n%d",x.a);
執行後printf("\n%d",x.a);
的結果是不一樣的。原因是我前面已經說過了「在存放數據的時候是按union里定義的數據類型存放的」(但它並不覆蓋原先已經存放過數據的整個union數據區),而讀取的時候還是按union里定義的類型進行讀取的,但輸出的表示形式卻是仍由printf("\n%d",x.c);
中的(%d)控制的。
上面我們雖然x.c都是25,但讀取的時候,是按union中x.a的數據類型(int型)讀出的,這時實際讀出的類型就比x.c的char型數據要多了,多出來的數據就來至x.b在內存中殘留的數據。
㈧ c語言中聯合體有什麼用
其實聯合體也沒什麼用,你只要把結構體學好就行了,大部分還是用到結構體,而且聯合體和結構體差不多。
㈨ 在c語言中,共用體一般有什麼作用
共用體一般指聯合體,作用如下:
1、節省內存
有兩個很長的數據結構,不會同時使用,用結構體的話,只佔用最長的那個數據結構所佔用的空間,就足夠了。
2、做某些轉換用
union{char a[8];double x;};
x=20.8;
cout<<hex<<a[0]<<「 」<<a[1]<<…<<endl;
(9)c語言聯合體的使用擴展閱讀:
結構體和共用體
結構體和共用體的區別在於:結構體的各個成員會佔用不同的內存,互相之間沒有影響;而共用體的所有成員佔用同一段內存,修改一個成員會影響其餘所有成員。
結構體佔用的內存大於等於所有成員佔用的內存的總和(成員之間可能會存在縫隙),共用體佔用的內存等於最長的成員佔用的內存。
共用體使用了內存覆蓋技術,同一時刻只能保存一個成員的值,如果對新的成員賦值,就會把原來成員的值覆蓋掉。
共用體也是一種自定義類型,可以通過它來創建變數,
㈩ C語言聯合體
為什麼選A呢?union數據類型里的每一個變數共用一段內存,union長度和最長的變數一致;所以變數c的值和a[0]的低8位是一樣的(為啥是低8位?這和數據在內存中的組織形式有關),應該選B