我是位域概念的新手。我正在尝试访问结构中的元素,但它会在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;
}
答案 0 :(得分:6)
如果您打算访问与多种数据类型相同的数据,则需要使用union
in C。看一下
#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;
}
请注意,当union作为整数访问时,系统的字节序确定各个位字段的顺序。因此,在32位x86 PC(little-endian)上的上述程序将输出:
sizeof x is 4bytes
dd cc bb aa
0xaabbccdd
答案 1 :(得分:3)
这是因为aa
是一个结构,v
不是,{em>不兼容类型就像错误消息所说的那样。即使cc
是位域结构,它仍然只能用作具有单独成员的结构,而不是整数。
答案 2 :(得分:2)
如果我错了,请纠正我,但是你想为4字节大小的结构分配4字节大小的长度。如果是,这可能适合您:
aa = *(cc*)&v;
但是在这种情况下你应该知道字节顺序
答案 3 :(得分:0)
使用此:
aa.a = v;
而不是
aa = v;
答案 4 :(得分:0)
您正尝试将long
分配给不兼容的struct
。
您可以将cc的内部值指定给v:
cc c;
unsigned long v = 1458;
c.b = v;
如果你想让前8位在a
,你可以做
cc c;
unsigned long v = 1458;
c.a = v % 255;
c.b = v / 255 % 65280;