2013-08-30 41 views
1
#include<stdio.h> 
int main() 
{ 
    struct value 
    { 
    int bit1:1; 
    int bit3:4; 
    int bit4:4; 
    }bit={1,8,15}; 
    printf("%d%d%d",bit.bit1,bit.bit3,bit.bit4); 
    return 0; 
} 

輸出相關的不理解輸出:-1-8-1到位字段

我知道那是因爲無符號位的,但更多的解釋給我。無法得到爲什麼8打印-8和爲什麼15打印-1。

+0

檢查什麼是2的補碼這裏http://stackoverflow.com/questions/16728492/what-is-2s-complement-number/16728502#16728502 – 2013-08-30 12:33:47

回答

4
int bit4:4; 

是有符號的,所以有範圍[-8..7]。將它設置爲15相當於0b1111。假設2s complement等於-1。

類似地對於bit3,8等於0b1000。最高位告訴你這是一個負值。反轉其他位,然後加1會得到-8。

如果你想存儲值[8..15],你要麼需要一個5位有符號值或類型更改爲unsigned int

+1

它是實施定義是否int bit4:4定義有符號位或無符號位字段(在OP的特定情況**中清楚地標記**)。如果你想**一個有符號的位域,寫'signed int bit4:4;'C99 6.7.2:5 –

1

隨着4位,十六位組合interpreted如下:

0000 : 0 
0001 : 1 
0010 : 2 
0011 : 3 
0100 : 4 
0101 : 5 
0110 : 6 
0111 : 7 
1000 : -8 
1001 : -7 
1010 : -6 
1011 : -5 
1100 : -4 
1101 : -3 
1110 : -2 
1111 : -1 

您設置對應於0001的數字(1),1000(-8)和1111(-1)。

+0

OP,只是FYI,閃爍的光線只是解釋了二進制補碼而沒有說明。我指出了它,因爲當我開始時,它迷惑了我的地獄... – JimR

+0

@JimR這就是爲什麼我包括在頂部的鏈接:) – dasblinkenlight