我第一次浏览一些涉及大量结构和枚举的代码。所以我在理解上面临一些问题。有一些寄存器初始化使用结构?
struct register_name
{
uint32_t var1:10;
uint32_t var2:22;
};
它会创建 10 位和 22 位的 var1 和 var2 吗? (寄存器是32位的)
编译器不会在内部创建两个大小为 10 和 22 的对象。它会在内部创建一个大小为 32 的对象并将其分成两部分,将它们解释为 var1 和 var2。
编译器提供了一种可能性,您可以通过它来控制内部创建的对象数量。
考虑以下演示程序。
#include <stdio.h>
#include <stdint.h>
struct A
{
uint32_t var1:10;
uint32_t var2:22;
};
struct B
{
uint32_t var1:10;
uint32_t : 0;
uint32_t var2:22;
};
int main(void)
{
printf( "sizeof( struct A ) = %zu\n", sizeof( struct A ) );
printf( "sizeof( struct B ) = %zu\n", sizeof( struct B ) );
return 0;
}
它的输出是
sizeof( struct A ) = 4
sizeof( struct B ) = 8
在结构 B 的情况下,每个变量 var1
和 var2
都作为一部分包含在自己的大小等于 32 的内部对象中。
逻辑上var1
和var2
确实对应占用了10位和22位。编译器在幕后完成所有工作。
我是一名优秀的程序员,十分优秀!