访问结构中的位字段

时间:2013-08-01 08:57:49

标签: c

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

5 个答案:

答案 0 :(得分:6)

如果您打算访问与多种数据类型相同的数据,则需要使用union in C。看一下

的以下片段
  1. 写入一个将其视为32位整数的联合 (然后)
  2. 以4个单独的8位位字段的形式访问数据 (并且还有很好的衡量标准)
  3. 以32位整数
  4. 再次访问相同的数据
    #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;