2017-01-08 5 views
-4
#include<stdio.h> 
int main(void) 
{ 
struct str 
{ 
    int i: 1; 
    int j: 2; 
    int k: 3; 
    int l: 4; 
}; 

struct str s; 

s.i = 1; 
s.j = 2; 
s.k = 5; 
s.l = 10; 

printf(" i: %d \n j: %d \n k: %d \n l: %d \n", s.i, s.j, s.k, s.l); 

getchar(); 
return 0; 
} 

出力:誰かが私に説明して、なぜ次のような結果を得られるのでしょうか?ウェブサイトで与えられた

i: 1 
j: 2 
k: 5 
l: 10 

私はビットフィールドであるかを理解していない

i :-1 
j : -2 
k : -3 
l : -6 

を得ました。誰かがここでこのコードで何が起こっているか教えてくれますか?

+2

ビットフィールドの内容を調べるには、本またはGoogleを読むか、このサイトを検索してください。ビットフィールドの動作のほとんどが標準化されていないため、結果は例とは異なります。したがって、あなたのコードを異なるコンパイラまたは将来のコンパイラで動作させたい場合は、ビットフィールドを避けることをお勧めします。 –

+2

* "Output Given with the Website" * - どのWebサイトですか? – StoryTeller

+1

'int i:1'はゼロになります。 signed-intビットフィールドは符号のビットを予約し、1ビットしか提供していないので、符号付き整数のビットフィールドが残っています。このビットフィールドは、負または正の値を持ちますが、償還可能な大きさの値はありません値のためのビットが残っていない)。このコードの残りの部分は、提供されたビット(符号ビットより少ない)で可能な最大値に違反することを実践しているようです。 – WhozCraig

答えて

2

符号付き変数の幅ごとに可能なビットパターンの列を書き、その隣に10進数を指定すると、その結果が得られる理由がすぐにわかります。 2の補数表現を仮定すると、1ビットの符号付き変数は、-1と0の2つの値をとります.2ビットの符号付き変数は、-2〜1の範囲の値を格納します。 s.i = 1;のあなたの場合は

Bin Dec  Bin Dec  Bin Dec 
011 3  01 1  0 0 
010 2  00 0  1 -1 
001 1  11 -1 
000 0  10 -2 
111 -1 
110 -2 
101 -3 
100 -4 

int値1は、2進数の1である、とあなたは1ビットの変数のために見ることができるように、これは値を持つ-1。

s.j = 2;の場合、intの値2は2進数の10で、2ビットの変数でわかるように、値は-2です。

s.k = 5;の場合、intの値5はバイナリ101で、3ビットの変数でわかるように、この値は-3です。

しかし、これは、符号付き整数の表現可能な範囲外の値を割り当てる実装定義の動作であるため、何が起きているのかの単なる説明です。

私はあなた自身のために4ビットの1つを解決するために残します。 s.l = 10;を指定すると、その値も4ビット符号付き変数の範囲(-8〜7)の範囲外になります。

関連する問題