嗨,我正在尝试使用 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/