这里是我使用二进制位字段打印int编号找到的代码,但我也只使用int
,char
读取该字段的类型,因此,这个代码是否合法使用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}}
答案 0 :(得分:2)
位字段的类型应为
_Bool
,signed int
,unsigned 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和 即使在严格符合的模式下,也允许使用枚举类型。