[英]why *y = z binds y to the mem address, but *y = *x takes only a value?
[英]Why the value of x and y is 1
union test{
unsigned int x: 3;
unsigned int y: 3;
int z;};
int main(){
union test t;
t.x = 5;
t.y = 4;
t.z = 1;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
return 0;
}
我不明白為什么x和y的值為1,感謝您的幫助。
編輯:謝謝大家的輸入,您已經要求輸出我現在還沒有編譯器,我以在線方式編譯了代碼,這些是輸出
for z= 1 : t.x = 1, t.y = 1, t.z = 1
for z= 2 : t.x = 2, t.y = 2, t.z = 2
for z= 10 : t.x = 2, t.y = 2, t.z = 10
for z= 30 : t.x = 6, t.y = 6, t.z = 30
為什么這些奇怪的輸出?
編譯器為最大的union
成員分配內存。 在這種情況下,將分配z
內存。 由於最后一次賦值使z
具有值1
,因此內存中僅此值將覆蓋先前的值。 因此,存儲在分配的內存中的最后3位是001
。 訪問其他3
位成員將得出結果1
。
對於z
等於2
, 10
,和30
,最后3
位是010
, 010
和110
分別其是等於2
, 2
和6
分別以十進制。
這是一個工會,這就是工會的工作方式。 所有成員變量(x,y,z)都在內存中的同一地址,因此,如果更改一個,則全部更改。 從技術上講,您應該只閱讀您寫的最后一篇。 寫入z
,然后從x
或y
讀取是未指定的行為。
根據C-11規范草案§6.2.6.1
當值存儲在聯合類型的對象的成員中時,與該成員不對應但與其他成員對應的對象表示形式的字節采用未指定的值。
響應編輯:
10個十進制的低三位是010
二進制,即2個十進制。
30十進制的低三位是110
二進制,即6十進制。
在Union中,我們一次只能使用一個成員。 因此,最后將值分配為1。請在此處參考。
聯合會占用該成員中具有最大大小的內存。 因此,從該內存中,所有成員都必須在其中工作。 最后, z
將訪問內存,然后將該值設為1。
所有成員將使用相同的內存,因此前兩個成員將值設為1。
您可以像這樣驗證。 分配每個值后進行printf
。
t.x=5;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
t.y=4
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
t.z=1;
printf("t.x = %d, t.y = %d, t.z = %d", t.x, t.y, t.z);
沒錯。
z的最后3位與x和y共享。
對於z = 30 tx = 6,ty = 6,tz = 30
z = 0x1E = 00011110。
tx = 110 = 6
ty = 110 = 6
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.