4

I have the following code for self learning:

#include <iostream>
using namespace std;
struct bitfields{
    unsigned field1: 3;
    unsigned field2: 4;
    unsigned int k:  4;
};

int main(){
    bitfields field;
    field.field1=8;
    field.field2=1e7;
    field.k=18;
    cout<<field.k<<endl;
    cout<<field.field1<<endl;
    cout<<field.field2<<endl;
    return 0;
}

I know that unsigned int k:4 means that k is 4 bits wide, or a maximum value of 15, and the result is the following.

2
0
1

For example, filed1 can be from 0 to 7 (included), field2 and k from 0 to 15. Why such a result? Maybe it should be all zero?

4

3 に答える 3

9

あなたはあなたのフィールドを溢れさせています。例kとして、4ビット幅です。あなたが言うように、それは0から15までの値を保持することができます。バイナリ表現ではこれは

0  -> 0000
1  -> 0001
2  -> 0010
3  -> 0011
...
14 -> 1110
15 -> 1111

したがって、18を割り当てると、バイナリ表現になります

18 -> 1 0010 (space added between 4th and 5th bit for clarity)

k下位4ビットしか保持できないため、

k = 0010 = 2.

これは、残りのフィールドにも当てはまります。

于 2010-08-07T09:04:31.087 に答える
4

割り当てが各ビットフィールドをオーバーフローしたため、これらの結果が得られます。

変数filed1は3ビットですが、8は提示するのに4ビットかかります(1000)。下位3ビットはすべてゼロであるため、filed1ゼロです。

の場合filed2、17は10001で表されfiled2ますが、4ビットのみです。下位4ビットは値1を表します。

最後に、の場合k、18は10010で表されkますが、4ビットのみです。下位4ビットは値2を表します。

それが物事を片付けるのに役立つことを願っています。

于 2010-08-07T09:04:31.260 に答える
1

C ++では、unsigned型は、上限に達すると折り返されます[1]。4ビットのビットフィールドを定義すると、格納するすべての値もラップアラウンドされます。サイズ4のビットフィールドで可能な値は0〜15です。「17」を保存する場合は「1」にラップし、「18」の場合はもう1つ「2」にラップします。

数学的には、ラップされた値は、宛先タイプの可能な値の数を法としての元の値です。

サイズ4のビットフィールド(2 ** 4の可能な値)の場合:

18 % 16 == 2
17 % 16 == 1

サイズ3のビットフィールド(2 ** 3の可能な値)の場合:

8 % 8 == 0.

[1]これは、署名されたタイプには当てはまりません。署名されたタイプでは、その後何が起こるかが定義されていません。

于 2010-08-07T09:06:17.120 に答える