來看下面一段代碼:
#include<stdio.h>
struct data
{
int a : 1;
int b : 31;
};
int main()
{
struct data test;
test.a = 1;
if(test.a == 1)
printf("a == 1\n");
else
printf("a !=1\n");
printf("a = %d",test.a);
}
這段代碼的結構體中定義了一個int型的位域變量,想用來接收0或1,按照這樣的話將1賦給a後那麼程序的結果應該是“a==1”。但實際上結果如下:
這是因爲,當把1存放到內存時,計算機會認爲這是一個負數,負數在內存中以補碼的形式存在,原碼就是-1。
我們都知道,在32位編譯器中最大的正數就是後面31位全爲1,最高位爲符號位,如果全1則表示補碼,原碼爲-1。
而如果int是無符號類型則不存在此問題,將上面代碼的int聲明爲無符號類型則可得到期望結果,我這裏程序運行的結果如下: