首页 > 解决方案 > c中的结构位值问题

问题描述

嗨,我正在尝试使用 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。有人可以知道为什么会这样吗?而且我认为结构的大小是 1 位,但是当我执行 sizeof(struct binary) 时,它显示为 4 个字节,你知道为什么吗?

TIA

标签: cstructbit-manipulationbit

解决方案


定义一个 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

推荐阅读