#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?
#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位整數可以表示的值的範圍。
你能否詳細解釋一下輸出?它是如何實際存儲它的字段中的值?說如果我改變bit1:1 bit2:8 bit3:8其顯示-1 -8 -8作爲輸出,爲什麼是這樣? – 2012-04-10 19:20:07
@code_hacker:您需要閱讀關於two-complement的工作原理(請參閱我的答案中的鏈接)。那應該是有道理的。 – 2012-04-10 20:07:54
bit1
是一個有符號的1位整數,它只能保存值-1
和0
。
初始化將(帶符號)整數'1'轉換爲該範圍,所以這甚至是未定義的行爲,不是嗎? – 2012-04-10 20:11:51
注意裏面 下面的語句結構:
INT位1:1; - >'int'表示 它是一個SIGNED整數。 對於帶符號整數,最左邊的位將作爲+/-符號。 如果您在1位字段中存儲1: 最左邊的位是1,因此 系統會將值視爲 負數。
2的補碼方法是 系統用於處理 負值。
因此,所存儲的數據是1 基於2的1的補體也爲1 (負)。
因此打印-1。
如果存儲2 4比特字段: 二進制2:0010(最左邊的位是0,所以 系統會將其視爲正值)0010是2 因此2被打印。
對於位域,「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
似乎像功課。 – spidey 2012-04-10 19:03:13
它是實現定義'int'位域是'signed int'還是'unsigned int'。在一些編譯器上,你可以得到'1 2 2'作爲輸出。爲了便攜性,你應該使用'unsigned int'或'signed int'作爲位域。或者不使用位域。 – ouah 2012-04-10 19:09:57