Tag: 位字段

重新启动后,位字段为keil hardfault

当我在闪存设备之后使用此结构时它运行良好,但在使用此结构重新启动(电源开/关)(分配给任何位)后会导致HardFault irq。 我使用Keil uVision和STM32F205。 为什么它不起作用? 我应该更改/删除/添加什么来修复它? 直接使用GPIOC-> ODR不会导致Kail中的位域有什么问题吗? #pragma anon_unions typedef union { struct { __IO uint16_t Data_Bus:8; // 0-7 data bus __IO uint16_t Ctr_Pins:6; // 8-13 control pins __IO uint16_t :2; // 14-15 unused here }; struct { __IO uint16_t D0:1; // 0 data bus pin __IO uint16_t D1:1; // 1 data bus pin […]

Typedef一个位域变量

我想要一个1位整数的typedef,所以我虽然这个typedef int:1 FLAG; 但是我遇到了错误,我有办法吗? 谢谢

用于从H / W寄存器读取的位字段

我想从32位寄存器读取第2,第5和第6位。 我决定使用struct位字段来存储它们。 以下数据结构是否正确? struct readData { int unwanted:1; int reqbit1:1; int unwanted1:2; int reqbit2:2; int unwanted2:26; }; 我不确定如何创建位字段。 我将使用一个API,它将字节从h / w寄存器直接复制到此结构。 在那种情况下,reqbit1会包含第二位吗? 根据我的理解,编译器将第一位分配给一个int变量,第二位分配给另一个int变量,因此reqbit1将不会从寄存器中读取任何数据。 以下联盟不适合这种情况吗? union readData { struct readBits{ bool unwanted:1; bool reqbit1:1; xxx unwanted1:2; short reqbit2:2; xxx unwanted2:26; }; int regValue; }; 如果这是对的,我应该将不想要的2声明为什么?

位域声明中的整数宽度是否相关?

我试图找到一个我不应该写的原因 struct bitfield { signed foo:4; unsigned bar:2; }; 而不是详细说明 struct bitfield { signed int foo:4; unsigned int bar:2; }; 由于在冒号后明确指定了位域的每个成员的大小,是否有任何缺点? 如果我使用char , short , long , long long ,这有关系吗? 指定的位域位数必须总是小于声明类型的宽度吗? 发现了一些相关问题: 除int之外的其他类型的位域? 在位域内声明不同数据类型有什么用? 答案范围从 不要使用除(signed / unsigned) int或_Bool之外的任何其他类型 _Bool , signed int , unsigned int或其他一些实现定义的类型。 (C99 6.2.7.1(4)) 在这种情况下:这个非特定的其他实现定义类型可能是什么样的,以及我在这个地方的选择可能会产生哪些其他缺点?

为什么以下代码的输出是-1和-2?

为什么下面代码的输出是-1和-2,它应该是1和2,对吧? 在以下结构的64位服务器大小上也是4字节,它应该是8字节对吗? #include struct st { int a:1; int b:2; }; main() { struct st obj={1,2}; printf(“a = %d\nb = %d\n”,obj.a,obj.b); printf(“Size of struct = %d\n”,sizeof(obj)); }

位字段可移植性

我在这里读到位字段不可移植。 这是否意味着下面定义位字段的代码(从这里获取的代码)无法在某些机器上编译? 如果是这样,为什么呢? #include #include /* define simple structure */ struct { unsigned int widthValidated; unsigned int heightValidated; } status1; /* define a structure with bit fields */ struct { unsigned int widthValidated : 1; unsigned int heightValidated : 1; } status2; int main( ) { printf( “Memory size occupied by status1 : %d\n”, sizeof(status1)); […]

在C / C ++中读/写半字节(没有位字段)

是否有一种简单的方法可以在不使用位字段的情况下读取/写入字节中的半字节? 我总是需要读取两个半字节,但需要单独编写每个半字节。 谢谢!

这个位域会以我期望的方式工作吗?

我一直在读C中的位域,C标准如何不强制机器字中字段的任何特定顺序,等等。 我希望这个问题适合SO的格式。 我的问题是我的结构(后面的定义)是否会以我期望的方式实际执行。 这是我想出的定义,然后我会讨论我想要的东西: typedef enum { STATE_ONE, STATE_TWO, STATE_THREE, STATE_FOUR } __attribute__ ((packed)) State; typedef struct MyStruct { // One of State enum (maximum of 4 states). unsigned state : 2; // Remaining 30 bits are used differently depending on ‘state’. union { // If ‘state’ is STATE_ONE (0), the remaining bits are an […]

C位域内存使用情况

我需要以下面的forms处理一些数据: typedef struct{ unsigned n1 : 12; unsigned n2 : 12; unsigned n3 : 12; unsigned n4 : 1; unsigned n5 : 35; } data; 我确保它们总共可以计算9个字节。 但他们没有..将该结构的9个字节写入文件并将其读回不会恢复所有数据,而sizeof(data)返回16。 这有什么问题?

在C中使用位域的正确方法是什么?

我正在使用位域来轻松访问浮动库我试图为没有FPU的微控制器。 问题是我似乎无法使用bitfields。 看一看: typedef struct { union{ unsigned long mantissa: 23; unsigned long exponent: 8; unsigned long sign: 1; float all; }; }_float __attribute__((__packed__)); 问题是,当我尝试访问或更改任何内容时,它会将位域分别视为末端的1,8,23位。 虽然它应该是从末尾开始的23位,然后是8位然后是最后一位。 除非我完全误解了位域的使用。 我认为使用打包可以解决问题,但你可以看到它没有。 任何帮助将非常感激。 我一直在谷歌搜索这个网站不止一次,所以我寄予厚望。