為什麼共用體變數輸出的值不一樣
㈠ C\C++聯合體(共用體)數值問題,高手請進!高分配英雄!
共用體的特慎森點時,同一個共用體內的各個變寬逗畝量的地址相同。以這個為例,a,b,c及x的變數地址是相同的,比如在我的VC2008的顯示地址是0x0012ff60。x所佔的位元組就等於a\指稿b\c里佔位元組最大的,也就是a和b,都佔4個位元組,那麼x也佔4個位元組。x的值是100。也就是說下面這樣。
0x0012ff60 64
0x0012ff61 00
0x0012ff62 00
0x0012ff63 00
那麼a的值也是100,確切的說是0x00000064 ,也就是10進制的100. c佔一個位元組,應該為0x64,也就是10進制的100.
b是浮點型,他在內存中存放和整形不一樣。浮點數據在內存中的存放方式比較復雜,不好理解。
你可以在網上查下。
根據IEEE的標准,浮點數的定義如下
符號位 指數位 小數部分 指數偏移量
單精度浮點數 1 位[31] 8位 [30-23] 23位 [22-00] 127
雙精度浮點數 1 位[63] 11 位[62-52] 52 位[51-00] 1023
把0x00000064換成4位元組32位的二進制看下
00000000 00000000 0000000 01100100
第32位是符號位,0是正,1是負
30-23位是指數,
22-0位是小數。
不知道TC環境下為什麼是0.000,沒有裝TC ,不過1.4013e-043近似值是0.0000
㈡ 共用體變數
共用體實際共用的是同一塊存儲地址(看哪個變數類型大,最大類型的變數確定了地址的大小),比如int a,與long long b,假設int是4位元組,long long是8位元組,那麼地址位數就是按8位元組分配的,假設b的8位元組的起始位絕塵置是0x0000,末位置是0x0007.那麼a的起始地址是0x0000,末地址是0x0003。當你對任意一個變數賦值槐鎮時都可能會改變a或b的值(因為共用同一塊地址,比如對a賦值,如果前四位地址存儲的數據不變,那麼b就不變,對於b也是同樣的道理),a,b的值都能讀出來,因為分配了內存,只不過讀出來的值可能和你預期的不一樣而已。所以共用體的值都是以最後鉛宏粗一次對那個變數賦值為准。
㈢ c語言共用體輸出問題
這個是共用體的問題
由於共用體共用同一段起始內存的地址,所以後一次的數據寫入可能會覆蓋前一次的數據
然後lz這道題,如果系統將int做2直接處理(比如TC2)的話,結果是380039和9;如果是按4位元組處理的話,結果應該是39和9
下面針對lz的結果,講一跡棚虧下2位元組處理的情況
第一姿神個共用體成員是int的數組,兩個元素,和運共4位元組
第二個成員是long,4位元組
第三個成員是char數組,4個元素,4位元組
所以這個union變數共4位元組
s.a[0]=0x39;
s.a[1]=0x38;
導致變數s的內存存儲的16進制數據(小尾存儲的話)高位到低位依次為為
00 38 00 39
所以才會導致輸出380039和9
4位元組處理的話,同理