-2

値がどのように保存および計算されるか、出力を説明できる人はいますか?

#include<stdio.h>
struct bitfield
{
    unsigned f1:1;
    unsigned f2:2;
    unsigned   :3;
    unsigned f4:4;
    unsigned f5:5;
    unsigned f6:6;
    unsigned f7:1;
    unsigned f8:8;
} bf;

main()
{
    bf.f1 = 1;
    bf.f2 = 0x3;
    bf.f4 = 0xff;
    bf.f5 = -4;
    bf.f6 = 0377;
    printf("%d %d %d %d %d %d", bf.f1, bf.f2, bf.f4, bf.f5, bf.f6, bf.f8);
}

出力:1 3 15 28 63 0

4

4 に答える 4

4

非常に短いランダウン。

まず、bf初期化されていないグローバル変数です。.bssこれは、通常、起動時にゼロで初期化されるセグメントで終了することを意味します (ただし-fno-zero-initialized-in-bss、GCC に渡してこれを停止できますが、MSVC については不明であり、もちろん に依存しますcrt0)。f8あなたがそれに書いていないので、これは の値を説明しています。

f1は 1 です。1 を割り当てます。それは明らかです。と同じf2です (16 進 3 は 12 進 3 であるため)。

f4これは、f4 のフィールドが 4 ビット幅しかないためです。0xFFは、すべて 1 の 8 ビット パターンであり、4 ビットに切り捨てられるため、15 (4 ビットで表現できる最大値) になります。

f5これは、符号付き/符号なしの変換によるものです。-4 の 5 ビットの 2 の補数表現は 11100 です。その値を符号なし (または単なる 2 進数から 10 進数への変換) と解釈すると、28 になります。

f6は 8 進数変換のため 63 です。ゼロで始まる C のリテラル数値はすべて 8 進数として扱われます。8 進数の 377 は 10 進数の 255 (8 ビットでは 11111111) であり、6 ビットに切り捨てられ、111111. これは63です。

于 2013-06-10T09:50:07.347 に答える
2

指定したフィールドに値が格納されます。ただし、bf.f4 = 0xff;値が適合しない場合など、上位ビットが失われる場合があるため、15 (0x0F) が出力されます。32 ビット整数として格納される -4 についても同様ですf5 -4 = 0xFFFFFFFCが、符号なし 5 ビット整数として格納されると、0x1C または 28 になります。同じ原則が に適用されf6ます。

との間に名前のないメンバーを使用した 3 ビットの「ギャップ」もf2ありf4ます。

内部的には、コンパイラは AND、SHIFT、および OR 演算を使用してこれを行います。

がフィールドが格納されている値全体の最上位ビットか最下位ビットかを知ることはできないことに注意してくださいf1。これは、毎回同じ方法で行われる限り、コンパイラの実装が決定するものです。

于 2013-06-10T09:49:55.090 に答える
1
unsigned fx:n; // Only use the least significant n bits.

               //                        Binary    Decimal
bf.f1 = 1;     // 1    == [0000 0001]:1   == 1      == 1
bf.f2 = 0x3;   // 0x3  == [0000 0011]:2   == 11     == 3
bf.f4 = 0xff;  // 0xff == [1111 1111]:4   == 1111   == 15
bf.f5 = -4;    // -4   == [0xfffffffc]:5  == 11100  == 28
bf.f6 = 0377;  // 0377 == [1111 1111]:6   == 111111 == 63
于 2013-06-10T09:59:54.387 に答える
0
unsigned f1:1;           // 1 bit is allocated. 
bf.f1=1;                 // you are storing 1 works fine.

unsigned f2:2;           // 2 bit is allocated.
bf.f2=0x3;               // 3 == '11' in binary so 2 bits are enough so when you print 3 is printed.

unsigned   :3;

unsigned f4:4;          // 4 bit is allocated.
bf.f4=0xff;             // ff is represented as 1111 1111 in binary, 
// but only 4 bits are allocated so only f which is 1111 
// in binary gets stored in this. when you print using %d, 15 is getting printed.


unsigned f5:5;         // 5 bits are allocated
bf.f5=-4;              // -4 in binary for 5 bits is 11100 but you are printing it as %d so it will print 28. and so on...

これが役立つことを願っています。

于 2013-06-10T09:56:45.570 に答える