#include<stdio.h>
struct a
{
int a:4;
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
這裏的輸出是-7。爲什麼這樣? 究竟是什麼int a:4呢?請詳細解釋在結構中使用帶int的位
#include<stdio.h>
struct a
{
int a:4;
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
這裏的輸出是-7。爲什麼這樣? 究竟是什麼int a:4呢?請詳細解釋在結構中使用帶int的位
因爲它是two's complement,最高位用於標誌。通過編寫a:4
即表示您只需分配4位內存,剩餘3位用於實際編號。所以我們的有效範圍是[-8,7]
。由於所有1都是-1,所以在負面上有一個額外的數字。有關這方面的更多解釋,請參閱上面的鏈接。
9,in(unsigned)binary is:1001
。當你把這個變成a
(有符號)時,由於最初的1,你得到a
爲負數,並且因爲以下數字是001
,所以我們給最大負數加1,從而得到-7。
如果要將數字9僅存儲在4位中,則需要使用unsigned int
,這會使您的範圍爲[0, 15]
。
編輯:
萬一有人用搞清楚如何1001
簽署奮力爲我們提供了-7,考慮以下因素:
由於1111
是-1,讓一些變量value = -1
。
找出一個負的值(符號)int num
,讓我們表示X 我在num
:
X 我:{0,1在位置i,其中i = 0是至少顯著位)},
然後,對於每x 我 = 0,減去2 我從value
。
實施例:
1001
:
value
= -1 - 2 - 2 = -7
您只爲字段保留4位,一位用於符號,因此只有3位保留爲正值。因此,最多隻能存儲7個值。
請問您可以使用二進制表示法解釋嗎? –
@RajaNarayan檢查我的答案。 –
@SteveP。感謝您的解釋! –
您的字段是一個4位有符號整數。對於有符號整數,高位是符號位,這意味着實際數字只有3位。您可以在該字段中存儲的數字範圍是-8到7(假設2的恭維存儲)。
9的位模式是1001,它有第4位的設置,這意味着它被解釋爲負數,這就是爲什麼它打印爲-7。如果您預期爲-1,則需要閱讀2's compliment。
如果你希望能夠存儲9在外地,使a
的unsigned int
必須使用無符號確實 INT :
#include<stdio.h>
struct a
{
unsigned a:4; // <-- unsigned indeed int, then work good
};
main(){
struct a aa;
aa.a=9;
printf("a=%d\n",aa.a);
return 0;
}
輸出:
a=9
默認情況下,位域中的int可能是'unsigned int'。它看起來不在OP的情況下,但它從不會傷害到閱讀文檔。 –
不錯的問題和非常好的答案!我驗證了無符號類型會給出預期的答案。 – lsk
@ user1930928謝謝。 :) –