gpt4 book ai didi

c - Little Endian 结构如何存储位域和长字?

转载 作者:太空宇宙 更新时间:2023-11-04 08:14:30 26 4
gpt4 key购买 nike

所以,我可以理解为 0x1234 的一个字,当存储为 little-endian 时,在内存中变为 0x3412。我还看到字节 0x12 作为位域 a:4,b:4 将存储为 0x21。但是,如果我有更复杂的东西怎么办?数据如 0x1700581001FFFFFF 具有以下结构排序?我看到数据存储为 0x7180051001FFFFFF,这对我来说意义不大。似乎“a”和“b”被交换了,但它们仍保留在结构的开头,而 g 与其他看似随机的交换一起保留在末尾。为什么?另外,我留下了“LONGWORD”的表示,因为它在代码中。我不确定 4 位如何成为一个长字,但也许这与这种疯狂有关?

LONGWORD a: 4
LONGWORD b: 4
LONGWORD c: 4
LONGWORD d: 12
LONGWORD e: 8
LONGWORD f: 8
LONGWORD g: 24

最佳答案

以“实现定义的方式”。根据 6.7.2.1 结构和 union 说明符C Standard 的第 11 段:

An implementation may allocate any addressable storage unit large enough to hold a bit-field. If enough space remains, a bit-field that immediately follows another bit-field in a structure shall be packed into adjacent bits of the same unit. If insufficient space remains, whether a bit-field that does not fit is put into the next unit or overlaps adjacent units is implementation-defined. The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined. The alignment of the addressable storage unit is unspecified.

回答你的问题但是如果我有更复杂的东西怎么办?类似 0x1700581001FFFFFF 的数据具有以下结构排序?

在这种情况下,如果您想要可移植且可靠的代码,正确的答案是不使用位域。事实上,您未能在您的问题中提供足够的信息来让任何人提供关于如何将数据放入您描述的位域的答案,这应该告诉您使用位域时出现的问题。

例如,给定您的位域

LONGWORD a: 4
LONGWORD b: 4
LONGWORD c: 4
LONGWORD d: 12
LONGWORD e: 8
LONGWORD f: 8
LONGWORD g: 24

如果假设 16 位 int 类型的值用于位域,那么这样布置数据将是完全正确的:

16-bit `int` with `c`,`b`,`a` - in that order
16-bit `int` with `d`
16-bit `int` with `f`,`e` - in that order
16-bit `int` with first 16 bits of `g`
16-bit `int` with last 8 bits of `g` - **after** 8 bits of padding.

这甚至还没有进入存储的字节顺序。

关于c - Little Endian 结构如何存储位域和长字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36553691/

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