2013-07-13 58 views
6
#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的位

回答

5

因爲它是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

+0

默認情況下,位域中的int可能是'unsigned int'。它看起來不在OP的情況下,但它從不會傷害到閱讀文檔。 –

+0

不錯的問題和非常好的答案!我驗證了無符號類型會給出預期的答案。 – lsk

+0

@ user1930928謝謝。 :) –

3

您只爲字段保留4位,一位用於符號,因此只有3位保留爲正值。因此,最多隻能存儲7個值。

+2

請問您可以使用二進制表示法解釋嗎? –

+0

@RajaNarayan檢查我的答案。 –

+0

@SteveP。感謝您的解釋! –

4

您的字段是一個4位有符號整數。對於有符號整數,高位是符號位,這意味着實際數字只有3位。您可以在該字段中存儲的數字範圍是-8到7(假設2的恭維存儲)。

9的位模式是1001,它有第4位的設置,這意味着它被解釋爲負數,這就是爲什麼它打印爲-7。如果您預期爲-1,則需要閱讀2's compliment

如果你希望能夠存儲9在外地,使aunsigned int

2

必須使用無符號確實 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