c - c 中结构位值的问题

标签 c struct bit-manipulation bit

嗨,我正在尝试使用 struct 将十进制值转换为 c 中的二进制值。下面是我的代码:

#include <stdio.h>
struct binary{
    int bin:1 ;
};
void main(void){
    int dec = 24;
    struct binary bi[32];
    //printf("%d\n",sizeof(struct binary));
    for(int i = 0 ; i < 32 ; i++){
        int k = dec & 1;
        bi[i].bin = k;
        dec = dec >> 1;
        //printf("%d ",k);
    }
    for(int i = 31 ; i >= 0 ; i--){
        printf("%d ",bi[i].bin);
    }
}

当我打印这些值时,我在位字段 (0000_0000_0000_0000_0000_0000_000-1_-1000) 中看到 -1 代替 1。有人可以知道为什么会发生这种情况吗?而且我还认为 struct 的大小是 1 位,但是当我执行 sizeof(struct binary) 时,它显示为 4 个字节,你知道为什么吗?

TIA

最佳答案

定义 1 位大的位字段是毫无意义的,而且标准也没有很好地定义。位字段的大多数方面都没有指定,包括 int 位字段是否应算作有符号或无符号。最好的建议是保持 100% 清除位域,特别是在处理二进制内存映射时。

值得注意的是,您实际上并没有转换任何内容 - 您只是逐位复制 32 位 int,您可以一次复制整个 32 位。由于程序中的所有数据都已经是二进制形式,因此无需转换任何内容。只需调整打印例程:

uint32_t dec = 0xDEADBEEF;
const size_t bits = 8*sizeof(dec);
for(size_t i=0; i<bits; i++)
{
  uint32_t mask = (1u << (bits-i-1));  // mask from MSB to LSB
  printf("%d", (_Bool)(dec & mask));   // convert zero/non-zero value into 0 or 1
}

输出:

11011110101011011011111011101111

关于c - c 中结构位值的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56626216/

相关文章:

结构中的 C 2 维字符

java - 为什么在java中位移位对-1不起作用?

go - 如何编辑埋在递归结构中的数组

python - 对数组的连续子数组进行 XOR

performance - 仅使用位操作的高效方法

c++ - 编译器在编译时给出的缓存信息

在 C 中将项目强制转换到链表末尾

c++ - 如何使图片适合静态控件 vc++ win32

c - 如何在代码块中设置 GTk 2

c - 为什么填充必须是2的幂?