gpt4 book ai didi

c - 位域可移植性

转载 作者:太空狗 更新时间:2023-10-29 16:50:44 26 4
gpt4 key购买 nike

我读了here该位字段不可移植。这是否意味着下面定义位域的代码(取自 here 的代码)无法在某些机器上编译?

如果是,那为什么?

#include <stdio.h>
#include <string.h>

/* 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));
printf( "Memory size occupied by status2 : %d\n", sizeof(status2));

return 0;
}

最佳答案

位域是可移植的,因为它们是标准中指定的 C 语言的一部分(C11 第 6.7.2.1 节)。任何无法识别使用位域的代码的编译器都不符合标准。您的示例也没有什么真正值得怀疑的,因为它所做的只是存在位域。

他们的意思可能是字段本身的位置和顺序可能无法预测(标准允许,之前的引用文献第 11 段)。这意味着一个结构,例如大小为 4、12、13 和 3 的四个位域不一定占用 32 位,并且它们不一定按该顺序放置在结构中;编译器可以将它们放在它喜欢的地方。这意味着该结构不能被视为底层二进制对象的实际组件方式表示。

相比之下,手动应用于整数的位掩码存在于您放置它们的位置。如果您定义屏蔽无符号整数的前 4 位、后 12 位等的掩码,则“字段”实际上将按顺序和位置应用于这些位(无论如何,假设您知道字节序)。这使得表示与编译器无关。

即它们是可移植的,但它们所做的可能不一定正是真正想要操纵单个位的人可能需要的。

关于c - 位域可移植性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25345691/

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