gpt4 book ai didi

output - 不确定如何获得输出!位域

转载 作者:行者123 更新时间:2023-12-01 08:03:23 25 4
gpt4 key购买 nike

我已经看了这段代码一段时间了。我知道输出是 50 但我不确定这是怎么发生的。

struct
{
unsigned m : 3;
unsigned n : 5;
} b;

int main(void)
{
b.m = 2;
b.n = 6;

printf("%d", b);
}

如果有人能提供任何帮助,我将不胜感激。

最佳答案

好吧,似乎具有连续位域的结构被压缩,并且何时使用 %d 格式说明符传递给 printf,这表现为某种“位聚合”(见注释)。在使用不同的值等进行一些测试之后,我想出了以下方案:

结构成员(位域)是这样对齐的:

n n n n n m m m

ie in "descending" order - last comes first.

Then, in main, b.m gets the value 2 which in binary is 10 and in 3-digit format is 010, and b.n gets the value 6 which in binary is 110 and in 5-digit format is 00110, so you end up with 00110010 which has a dec value of ... 50.


To further test this hypothesis I expanded the b struct with one more member and checked if it still holds:

#include <stdio.h>

struct {
unsigned m : 3;
unsigned n : 5;
unsigned o : 5;
} b;

int main(void) {
b.m = 1;
b.n = 1;
b.o = 1;
printf("%d\n",b);
return 0;
}

根据假设,结构成员应该以这种方式对齐:

o o o o o n n n n n m m m

and with the values assigned to them in main (ie 1, 1 and 1) this should result to the binary 0000100001001 which in dec is 265.

Compiling and running yields:

$ gcc -Wall -o stprint stprint.c
stprint.c: In function ‘main’:
stprint.c:13:5: warning: format ‘%d’ expects argument of type ‘int’, but argument 2 has type ‘struct <anonymous>’ [-Wformat=]
printf("%d\n",b);
^
$ ./stprint
265

即(最有可能)验证假设的结果。希望我能阐明这种行为。


编辑/注意:如果上面的内容不清楚,正如其他评论者所指出的,此行为取决于实现,这意味着由编译器决定是否“bit aggregation”发生与否,具体顺序是什么。还必须考虑底层平台的字节顺序(例如,参见 here)对于这篇文章,gcc version 4.8.4 在 Ubuntu 系统中使用。

关于output - 不确定如何获得输出!位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35834037/

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