2012-04-10 29 views
7
#include<stdio.h> 

int main() 
{ 
    struct value{ 
     int bit1 : 1; 
     int bit3 : 4; 
     int bit4 : 4; 
     }bit={1,2,2}; 
    printf("%d %d %d\n",bit.bit1,bit.bit3,bit.bit4); 
    return 0; 
} 

輸出:說明1位位字段的行爲

-1 2 2

請解釋程序的oupput?

+1

似乎像功課。 – spidey 2012-04-10 19:03:13

+1

它是實現定義'int'位域是'signed int'還是'unsigned int'。在一些編譯器上,你可以得到'1 2 2'作爲輸出。爲了便攜性,你應該使用'unsigned int'或'signed int'作爲位域。或者不使用位域。 – ouah 2012-04-10 19:09:57

回答

8

推測唯一的好奇輸出是第一個。那麼,考慮一個1位整數可以表示的值的範圍。

+0

你能否詳細解釋一下輸出?它是如何實際存儲它的字段中的值?說如果我改變bit1:1 bit2:8 bit3:8其顯示-1 -8 -8作爲輸出,爲什麼是這樣? – 2012-04-10 19:20:07

+0

@code_hacker:您需要閱讀關於two-complement的工作原理(請參閱我的答案中的鏈接)。那應該是有道理的。 – 2012-04-10 20:07:54

9

bit1是一個有符號的1位整數,它只能保存值-10

+0

初始化將(帶符號)整數'1'轉換爲該範圍,所以這甚至是未定義的行爲,不是嗎? – 2012-04-10 20:11:51

2

注意裏面 下面的語句結構:

INT位1:1; - >'int'表示 它是一個SIGNED整數。 對於帶符號整數,最左邊的位將作爲+/-符號。 如果您在1位字段中存儲1: 最左邊的位是1,因此 系統會將值視爲 負數。

2的補碼方法是 系統用於處理 負值。

因此,所存儲的數據是1 基於2的1的補體也爲1 (負)。

因此打印-1。

如果存儲2 4比特字段: 二進制2:0010(最左邊的位是0,所以 系統會將其視爲正值)0010是2 因此2被打印。

+0

對於位域,「int」不一定意味着SIGNED。 gcc手冊指出:「ISO C標準將它放到實現中,不管是否聲明瞭plain int的位域都是帶符號的,這實際上創建了兩個可選的C方言。但是,gcc和MSVC都將其視爲已簽名:請參閱http://msdn.microsoft.com/en-US/library/yszfawxh%28v=vs.80%29.aspx和http://gcc.gnu.org/ onlinedocs/GCC-4.1.2/GCC/Non_002dbugs.html。 – 2012-10-03 19:42:07