正确的方法使用二进制位字段打印编号

时间:2015-05-26 16:40:25

标签: c bit-fields

这里是我使用二进制位字段打印int编号找到的代码,但我也只使用intchar读取该字段的类型,因此,这个代码是否合法使用struct bits { unsigned char ch1 : 1;//01 unsigned char ch2 : 1; unsigned char ch3 : 1; unsigned char ch4 : 1; unsigned char ch5 : 1; unsigned char ch6 : 1; unsigned char ch7 : 1; unsigned char ch8 : 1; }; void main() { int data = -1; int length = 4; struct bits *p = &data; while (length--) { printf("%d%d%d%d %d%d%d%d ", (p + length)->ch8, (p + length)->ch7, (p + length)->ch6, (p + length)->ch5, (p + length)->ch4, (p + length)->ch3, (p + length)->ch2, (p + length)->ch1 ); } system("pause"); } 类型?

{{1}}

2 个答案:

答案 0 :(得分:2)

  

位字段的类型应为_Boolsigned intunsigned int或其他实现定义类型的合格或非限定版本。

某些编译器允许使用unsigned char作为"实现定义的类型"。

(p + length)->ch8将通过通常的整数促销作为可变参数函数的参数。因此,ch8将提升为与int匹配的"%d"

代码可以使用unsigned

struct bits {
    unsigned ch1 : 1;//01
    unsigned ch2 : 1;
    unsigned ch3 : 1;
    unsigned ch4 : 1;
    unsigned ch5 : 1;
    unsigned ch6 : 1;
    unsigned ch7 : 1;
    unsigned ch8 : 1;
};

答案 1 :(得分:1)

GCC是allowing任何整数类型作为位域,而不是C99和C11标准:

  

除_Bool,signed int和unsigned之外的允许位字段类型   int(C99和C11 6.7.2.1)。
  其他整数类型,例如long int和   即使在严格符合的模式下,也允许使用枚举类型。