-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(因为十六进制 3 是 dec 3)相同。

f4是因为 f4 的字段只有 4 位宽。0xFF是一个全为 1 的 8 位模式,然后将其截断为 4 位,因此为 15(可以用 4 位表示的最高值)。

f5是由于有符号/无符号转换。-4 的 5 位二进制补码表示为 11100。如果您将该值解释为无符号(或者更确切地说,只是一个普通的二进制 -> 十进制转换),您将得到 28。

f6是 63 因为八进制转换。任何以零开头的 C 文字数字都被视为八进制。八进制 377 是十进制 255(即 8 位的 11111111),然后将其截断为 6 位,留下111111. 这是63。

于 2013-06-10T09:50:07.347 回答
2

值存储在您指定的字段中。然而,由于在某些情况下,例如bf.f4 = 0xff;,该值不适合,它将丢失高位,因此它打印 15 (0x0F)。类似地,-4 存储f5 -4 = 0xFFFFFFFC为 32 位整数,但当存储为无符号 5 位整数时,它变为 0x1C 或 28。同样的原理适用于f6.

f2在 和 之间还有一个使用未命名成员的 3 位“间隙” 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 回答