gpt4 book ai didi

c++ - C 中位域的内存布局 - 无法理解输出

转载 作者:太空宇宙 更新时间:2023-11-04 01:28:45 25 4
gpt4 key购买 nike

我有这个代码 - http://ideone.com/sXhWxf

#include <stdio.h>

int main(void) {

struct bitfield{
unsigned a:5;
unsigned c:5;
unsigned b:6;
} bit = {1,3,3};

char *p = (char*)&bit;
printf("%d\n",*p);
p++;
printf("%d\n",*p);
// I assumed that the bits are laid out in the below order in the memory.
// Spaces are just for clarity
// 00001 00011 000011
// Also, I asumed that the 'char' will take 8 bits. But I can't understand output.
// According to me the output should be - 8 195 (considering the 1st 8 bits &
// last eight bits for the printf statements)
return 0;

输出是-

97
12

有人可以帮助我详细了解此输出吗? (请阅读代码中的注释)

另外,我在 Wikipedia 上看到了这个声明它说“位域的成员没有地址,因此不能与地址 (&) 一元运算符一起使用。sizeof 运算符可能不适用于位域。”但是我能够访问 'bit' 变量的地址。那个怎么样?我没有正确解释该陈述吗?请指导我。

最佳答案

假设您的目标机器上的整数是 32 位的,编译器将 bit 结构布置如下:

bit 31                            bit 0
| |
xxxxxxxxxxxxxxxx bbbbbb ccccc aaaaa

x 位未使用。

a=1, c=3, b=3,这就变成了

0000000000000000 000011 00011 00001

拆分为字节:

00000000 00000000 00001100 01100001

十进制:

0 0 12 97

当存储为小端整数时,字节顺序为 97 12 0 0,这解释了您的输出。

关于您的第二个问题:您获取的是 bit 结构的地址,而不是其任何位域的地址。 char *p = (char*)&bit.a; 将不起作用。

关于c++ - C 中位域的内存布局 - 无法理解输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26842043/

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