gpt4 book ai didi

c - 这是否会创建具有冒号后所写的相应大小的变量?

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:47 29 4
gpt4 key购买 nike

我第一次浏览一些涉及大量结构和枚举的代码。所以我在理解上面临一些问题。有一些寄存器初始化使用结构?

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 的情况下,每个变量 var1var2 都作为一部分包含在自己的大小等于 32 的内部对象中。

逻辑上var1var2确实对应占用了10位和22位。编译器在幕后完成所有工作。

关于c - 这是否会创建具有冒号后所写的相应大小的变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57922779/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com