2012-06-25 60 views
3

可能重复:
What does 'unsigned temp:3' means是什么意思 “:” 在结构Ç

struct Test 
    { 
     unsigned a : 5; 
     unsigned b : 2; 
     unsigned c : 1; 
     unsigned d : 5; 
    }; 

    Test B; 
    printf("%u %u %u %u", B.a, B.b, B.c, B.d); // output: 0 0 0 0 
    static struct Test A = { 1, 2, 3, 4}; 

有人能解释我是什么在结构:目的,printf只是输出0所以我认为这些不是默认值,但它们是什么?

也可能有人能解释我为什么A.a, A.b, A.c, A.d输出1, 2, 1, 4,而不是1, 2, 3, 4

回答

8

这是一个bit field

它基本上告诉编译器hey, this variable only needs to be x bits wide, so pack the rest of the fields in accordingly, OK

+0

@Downvoter,解释一下吗? –

1

这些位字段看到this Wikipeadia section on Bitfields或约bit fields

:后的数字表示该参考你有多少位要储备为左边的标识符。这使得您可以通过紧密打包数据来分配比通常情况更少的空间。您只能在struct s或union s中执行此操作。

这是关于比特字段的简短tutorial

+0

断开的链接。请务必在下次链接到文章的正确部分。 –

+0

https://en.wikipedia.org/wiki/C_syntax#Bit_fields – WakiMiko

0

简单说明:您可以指定变量应该有多少位。 (您不能指定比原始大小更多的位)
编辑:您的第三个变量只打印1,因为它只有1 bit来存储其数据。所以该值只能是01。十进制值3以二进制格式表示为11。所以无论哪个位被截断,你最终都会在变量中存储一个1