gpt4 book ai didi

c - 在结构中混合位域

转载 作者:太空宇宙 更新时间:2023-11-04 06:20:49 24 4
gpt4 key购买 nike

卡在 geeksforgeeks 上关于位域,找到了这个例子:

#include <stdio.h>

struct test {
unsigned int x;
long int y : 33;
unsigned int z;
};

int main() {
struct test t;
unsigned int *ptr1 = &t.x;
unsigned int *ptr2 = &t.z;
printf("%d", ptr2 - ptr1);
return 0;
}

结果,输出是 4。但为什么呢? x占4个字节,y - 8,z - 4。地址x和z的差必须是8?

最佳答案

此代码没有可确定的行为。如果没有一个非常具体的编译器,就不可能预测它的任何结果。

它包含以下实现定义的行为(引用自标准的附件 J):

— Whether a ‘‘plain’’ int bit-field is treated as a signed int bit-field or as an unsigned int bit-field (6.7.2, 6.7.2.1).

— Allowable bit-field types other than _Bool, signed int, and unsigned int (6.7.2.1).

— Whether a bit-field can straddle a storage-unit boundary (6.7.2.1).

— The order of allocation of bit-fields within a unit (6.7.2.1).

— The alignment of non-bit-field members of structures (6.7.2.1). This should present no problem unless binary data written by one implementation is read by another.

第二个评论也意味着编译器必须有一个非标准的扩展。

最重要的是,代码还取决于字节顺序,您无法知道位域中的哪些位是 MSB 和 LSB。

关于c - 在结构中混合位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35406914/

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