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是賦值...