这是我发现的使用位字段以二进制形式打印 int 数字的代码,但我也仅使用 unsigned
, 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");
}
最佳答案
A bit-field shall have a type that is a qualified or unqualified version of
_Bool
,signed int
,unsigned int
, or some other implementation-defined type.
某些编译器允许使用 unsigned char
作为“实现定义的类型”。
(p + length)->ch8
将经历通常的整数提升,作为可变参数函数的参数。因此,ch8
将被提升为 int
,它与 "%d"
匹配。
代码可以使用无符号
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;
};
关于c - 正确的方法是使用位域以二进制形式打印数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30464287/