c - 正确的方法是使用位域以二进制形式打印数字

标签 c bit-fields

这是我发现的使用位字段以二进制形式打印 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/

相关文章:

c++ - 字段并集和结构并集之间的区别

c - 如何在位域结构中输入常量字段

c - 用于轻松位访问的位域 union ,意外行为

c++ - 使用C++开发一个Linux系统相关程序

自定义压缩算法

c++ - C 或 C++ - 与重复的组合

c - 如何将位域写入整数值?

C、BST、Pnode在字典中丢失

将大写更改为小写,反之亦然,无需使用函数和 if 语句

c - 如何制作位数组?