C語言結構體位域

來看下面一段代碼:

#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聲明爲無符號類型則可得到期望結果,我這裏程序運行的結果如下:
修改後結果

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章