Tag: 位域

位移,屏蔽还是位域结构?

我刚开始使用钻头。 我正在尝试使用现有的协议,它可以发送三种不同类型的消息。 类型1是16位结构: struct digital { unsigned int type:2; unsigned int highlow:1; unsigned int sig1:5; unsigned int :1; unsigned int sig2:7; }; 前两位(类型,在我上面的结构中)总是1 0。 第三位highlow确定信号是打开还是关闭,sig1 + sig2一起定义信号的12位索引。 该索引在两个字节之间被分割为0,总是在第7位。 类型2是32位结构。 它有一个2位类型,一个10位索引和一个16位值,在位置27,23,15和7处散布着0。一个位字段结构表示forms如下所示: struct analog { unsigned int type:2; unsigned int val1:2; unsigned int :1; unsigned int sig1:3; unsigned int :1; unsigned int sig2:7; unsigned int :1; unsigned […]

为什么C中的位字段需要定义类型unsigned int或signed int

我在我的C项目上运行代码质量检查,其涉及具有位字段的结构。 我遇到了一种情况,根据MISRA C 2004标准,规则#6.4 – 是一种违规,其内容如下:“6.4位字段只能被定义为unsigned int或signed int类型。” Microsoft Developer Network上提供的文献声明了这一点。 任何人都可以解释为什么bitfield成员的数据类型需要签名或无符号int? 为什么我不允许执行以下操作,即使以下代码编译时没有警告: typedef struct { char a: 4; char b: 4; char flag: 1; }MY_STRUCT

有符号位字段表示

我使用字段大小为1的位创建了一个字段,并使用int而不是unsigned 。 后来,当我试图检查字段的值时,我发现值为-1。 我使用此代码检查二进制represantation和我的位字段的值: #include #include union { struct { int bit:1; } field; int rep; } n; int main() { int c, k; n.field.bit=1; for (c = 31; c >= 0; c–) { k = n.rep >> c; if (k & 1) printf(“1”); else printf(“0”); } printf(“\n %d \n”, n.field.bit); return 0; } 输出为:00000000000000000000000000000001 […]

无符号位域的类型:int或unsigned int

C99标准的第6.3.1.1节包含: 如果可以使用int或unsigned int则可以在表达式中使用以下内容: […] _Bool , int , signed int或unsigned int类型的位字段。 如果int可以表示原始类型的所有值,则该值将转换为int ; 否则,它将转换为unsigned int 。 在我看来,这意味着unsigned int位字段被提升为int ,除非无符号位字段的宽度等于int的宽度,在这种情况下最后一个短语适用。 我有以下程序: struct S { unsigned f:32; } x = { 28349}; unsigned short us = 0xDC23L; main(){ int r = (xf ^ ((short)-87)) >= us; printf(“%d\n”, r); return r; } 还有两个系统来执行这个程序( int在两个系统上都是32位)。 一个系统说这个程序打印1,另一个系统说它打印0.我的问题是,我应该在哪两个系统中提交错误报告? (我倾向于针对打印0的系统提交报告,因为上面的摘录)

为什么普通变量不允许使用位域?

我想知道为什么位域与联合/结构一起使用但不能使用像int或short这样的正常变量。 这有效: struct foo { int bar : 10; }; 但这失败了: int bar : 10; // “Expected ‘;’ at end of declaration” 为什么此function仅在联合/结构中可用而不在变量中? 技术不一样吗? 编辑: 如果允许,你可以创建一个3字节的变量,而不是每次都使用struct / union成员。 这就是我对结构的看法: struct int24_t { int x : 24 __attribute__((packed)); }; struct int24_t var; // sizeof(var) is now 3 // access the value would be easier: var.x = […]

除int之外的其他类型的位域?

我有一个代码,它使用如下声明的位字段 typedef struct my{ const char *name; uint8_t is_alpha : 1; uint8_t is_hwaccel : 1; uint8_t x_chroma_shift; uint8_t y_chroma_shift; } mystr; uint8_t是对unsigned char typedef。 使用此位字段在MS-VS 2008中构建代码会发出如下警告: imgconvert.c(60):警告C4214:使用非标准扩展:除int之外的位字段类型。 使用除int之外的类型的位字段是否存在任何问题/潜在问题? 警告为什么? C99 C语言规范允许的是int类型的bit-fileds以外的吗?

在C中使用位字段时的字段顺序

我有一个以下类型的结构 typedef struct { unsigned int a : 8; unsigned int b : 6; unsigned int c : 2; }x, *ptr; 我想做的是改变字段c的值。 我做了类似以下的事情 x structure = { 0 }; x->c = 1; 当我查看内存映射时,我希望找到00 01 ,但我找到00 40 。 看起来在排列第二个字节时,它将c字段放在最低位中,将b字段放在最高位中。 我在GCC和Windows编译器上都看到了这一点。 现在,我做的是以下,这是正常的。 unsigned char ptr2 = (unsigned char*) ptr *(ptr2 + 1) &= 0xFC *(ptr2 + 1) […]

将位字段转换为int

我有这样声明的位字段: typedef struct morder { unsigned int targetRegister : 3; unsigned int targetMethodOfAddressing : 3; unsigned int originRegister : 3; unsigned int originMethodOfAddressing : 3; unsigned int oCode : 4; } bitset; 我也有int数组,我想从这个数组得到int值,它表示这个位字段的实际值(实际上是某种机器字,我有它的部分,我想要int表示整个字)。 非常感谢。

关于C位域的问题

bitfield是C概念还是C ++? 它只能在结构中使用吗? 我们可以使用它们的其他地方有哪些? AFAIK,bitfields是特殊的结构变量,只占用指定的no。 比特。 它在节省内存方面很有用。 我对么? 我编写了一个小程序来理解位域的使用 – 但是,我认为它没有按预期工作。 我希望下面结构的大小为1 + 4 + 2 = 7个字节(考虑到unsigned int的大小在我的机器上是4个字节),但令我惊讶的是,结果是12个字节(4 + 4 + 4) )。 谁能让我知道为什么? #include struct s{ unsigned int a:1; unsigned int b; unsigned int c:2; }; int main() { printf(“sizeof struct s = %d bytes \n”,sizeof(struct s)); return 0; } OUTPUT: sizeof struct […]