本文主要是介绍c语言bit位定义--位域的分配是怎样的? 最先定义的在最低位,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
//author: hjjdebug
//date: 2024年 03月 29日 星期五 14:37:38 CST
//c语言bit位定义--位域的分配是怎样的? 最先定义的在最低位
#include <stdio.h>
typedef struct {
unsigned int is_error : 1; //
unsigned int : 29; // 29位不用
unsigned int is_read : 1;
unsigned int is_write : 1;
} status_t;
status_t status;
int main()
{
status.is_error=1;
status.is_read=1;
status.is_write=1;
printf("is_error:%d, is_read:%d, is_write:%d\n",status.is_error,status.is_read,status.is_write);
// 编译器认为, is_error,is_read,is_write bit位本身就是unsigned int,
// 跟外部包装它的unsigned int 没有半毛钱关系, 你认为有关系,它认为那是强加给它的,它不承认
// 所以它死活不让转 cannot convert ‘status_t’ to ‘unsigned int’ in initialization
// unsigned int n=status;
// printf("n:%d\n",n);
// 换一种招数骗过它!!
status_t *pStatus = &status;
printf("status is 0x%x\n", *(unsigned int *)pStatus);
return 0;
}
执行结果为:
$ ./temp
is_error:1, is_read:1, is_write:1
status is 0xc0000001
/*
另外,也可以用gdb 调试一下, 查看它的具体实现.
(gdb) p status
$1 = {is_error = 1, is_read = 1, is_write = 1}
(gdb) p &status
$2 = (status_t *) 0x555555558014 <status>
(gdb) p/x *(int *)0x555555558014
$3 = 0xc0000001 // 我们看到 error 位在最低位, read,write在最高位.
(gdb) x/4b 0x555555558014 // 内存中,little-endian 的是低位在低byte
0x555555558014 <status>: 0x01 0x00 0x00 0xc0
intel-cpu 是little-endian,
位域的分配是把最先定义的bit位把到了最低位的bit上, 把最后定义的bit放到了最高位的bit上.
因而在little-endian 的cpu 上最低位在内存的低端的低bit上,最高位在内存高端高bit上.
我这没有 big-endian 的cpu(像motorola cpu), 不知道定义的bit位是否跟little-endian 的结构定义一致!
如果逻辑一致,即它的值也是0xc0000001,
那内存地址分配上就会不一致,因为它的高位在地址低端, 反正我的环境是little-endian
*/
这篇关于c语言bit位定义--位域的分配是怎样的? 最先定义的在最低位的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!