我对位字段概念很陌生。我正在尝试访问结构中的元素,但它显示错误aa=v
像这样。
error: incompatible types when assigning to type ‘cc’ from type ‘long unsigned int ’
如果我键入的话,它会显示错误aa= (cc)v;
error: conversion to non-scalar type requested
我尝试通过声明指向结构的指针来访问元素。我在这种情况下做得很好,但在这种情况下,我没有声明指向结构的指针,并且我必须访问元素。我怎样才能克服这个错误。
感谢您提前提供的任何帮助
#include<stdio.h>
typedef struct
{
unsigned long a:8;
unsigned long b:8;
unsigned long c:8;
unsigned long d:8;
}cc;
int main()
{
cc aa ;
unsigned long v = 1458;
printf("%d\n",sizeof(aa));
aa=v; // aa= (cc)v;
printf("%d %d %d %d\n", aa.a,aa.b,aa.c,aa.d);
return 0;
}
如果您打算以多种数据类型访问相同的数据,那么您需要使用union in C https://en.wikipedia.org/wiki/Union_type#C.2FC.2B.2B。看一下下面的代码片段
- 写入联合体,将其视为 32 位整数
(进而)
- 将数据作为 4 个单独的 8 位位字段访问回来
(也是为了好的措施)
- 再次以 32 位整数的形式访问相同的数据
#include<stdio.h>
typedef struct {
unsigned long a:8;
unsigned long b:8;
unsigned long c:8;
unsigned long d:8;
}bitfields;
union data{
unsigned long i;
bitfields bf;
};
int main()
{
union data x;
unsigned long v = 0xaabbccdd;
printf("sizeof x is %dbytes\n",sizeof(x));
/* write to the union treating it as a single integer */
x.i = v;
/* read from the union treating it as a bitfields structure */
printf("%x %x %x %x\n", x.bf.a, x.bf.b, x.bf.c, x.bf.d);
/* read from the union treating it as an integer */
printf("0x%x\n", x.i);
return 0;
}
请注意,当联合作为整数访问时,系统的字节序决定了各个位字段的顺序。因此,上述程序在 32 位 x86 PC(小端)上将输出:
sizeof x is 4bytes
dd cc bb aa
0xaabbccdd
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)