c - 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
解决方案
定义一个 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
推荐阅读
- html - 预测表上的 LiveScore 自动更新
- python - 为什么 ImageFilter.BoxBlur 给出错误的结果?
- javascript - 结果不会显示在异步函数的空数组中
- javascript - 为什么在监视模式下运行时 Terser 最小化器不会删除空格和换行符?
- enums - 在传递带有向量的文件时,如何在测试台中使用枚举?
- ios - 无法归档 SwiftUI 项目,入口点 (_main) 未定义。用于架构 arm64
- css - 盒子应该是垂直薄的,没有足够的内容,但是当内容太多时会有滚动条
- nginx - 为什么我的 nginx 即服务在 windows server 2016 中不起作用
- r - 如何使用 R 中的 fixst 删除一个固定效果?
- javascript - 从子元素设置父样式