2

我是位域概念的新手。我正在尝试访问结构中的元素,但它显示了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;
}
4

5 回答 5

6

如果您打算以多种数据类型访问相同的数据,那么您需要使用unionin C。看看下面的代码片段

  1. 写入将其视为 32 位整数的联合
    (然后)
  2. 以 4 个单独的 8 位位域的形式访问数据
    (也是为了更好地衡量)
  3. 以 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
于 2013-08-01T09:42:34.463 回答
3

这是因为aa是一个结构而v不是,类型不兼容,就像错误消息所说的那样。即使cc是位域的结构,它仍然只能用作结构,具有单独的成员,而不像整数。

于 2013-08-01T09:00:21.123 回答
2

如果我错了,请纠正我,但是您想为您的 4 字节大小的结构分配一个 4 字节大小的 long 。如果是,这可能适合您:

 aa = *(cc*)&v;

但是,在这种情况下,您应该注意字节顺序

于 2013-08-01T09:31:34.383 回答
0

用这个 :

aa.a = v;

代替

aa = v;
于 2013-08-01T09:02:49.373 回答
0

您正在尝试将 a 分配给longstruct兼容的 a。

您可以将 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;
于 2013-08-01T09:02:55.270 回答