从 32 位系统上的结构读取 long(C)
Reading a long from a struct on 32 bit system(C)
在 C 中,我有一个包含成员 "frequency" 的结构,它是一个 long unsigned int。此代码 运行 所在的硬件是 32 位。
结构在实例化时设置了值。
struct config_list configuration = {
...
.frequency = (long unsigned int)5250000000u,
...
}
在我的代码中,我通过指针将此结构传递给子例程。在这个子例程中,我似乎无法获得正确的值,所以为了检查,我输入了这个:
printf("Config frequency: %lu\n", ptr->frequency);
printf("Derefernced: %lu\n", (*ptr).frequency);
因为这是我相信您可以从指针访问结构数据的两种方式。
然而,在这两种情况下,我看到的输出都是 955,032,704。我认为这只是我设置的频率的前 32 位。我的问题是,为什么我的 long unsigned int 被削减为 32 位? "long" 不是应该将范围扩展到 64 位吗?
5250000000
是 0x1 38EC A480
... 它只是窥视第 33 位。
我建议您使用以下内容:
#include <stdio.h>
#include <stdint.h> /* gives us uint64_t and UINT64_C() */
#include <inttypes.h> /* gives us PRIu64 */
int main(void) {
uint64_t d = UINT64_C(5250000000);
printf("%"PRIu64"\n", d);
return 0;
}
uint64_t
在任何系统上都保证是 64 位无符号的。
UINT64_C
将附加正确的后缀(通常是 UL
或 ULL
)。
PRIu64
将为 64 位无符号指定正确的格式字符串。
在我的 64 位系统上,在预处理器 (gcc -E
) 之后看起来像这样:
int main(void) {
uint64_t d = 5250000000UL;
printf("%""l" "u""\n", d);
return 0;
}
对于 32 位构建,它看起来像这样 (gcc -E -m32
):
int main(void) {
uint64_t d = 5250000000ULL;
printf("%""ll" "u""\n", d);
return 0;
}
在 C 中,我有一个包含成员 "frequency" 的结构,它是一个 long unsigned int。此代码 运行 所在的硬件是 32 位。
结构在实例化时设置了值。
struct config_list configuration = {
...
.frequency = (long unsigned int)5250000000u,
...
}
在我的代码中,我通过指针将此结构传递给子例程。在这个子例程中,我似乎无法获得正确的值,所以为了检查,我输入了这个:
printf("Config frequency: %lu\n", ptr->frequency);
printf("Derefernced: %lu\n", (*ptr).frequency);
因为这是我相信您可以从指针访问结构数据的两种方式。
然而,在这两种情况下,我看到的输出都是 955,032,704。我认为这只是我设置的频率的前 32 位。我的问题是,为什么我的 long unsigned int 被削减为 32 位? "long" 不是应该将范围扩展到 64 位吗?
5250000000
是 0x1 38EC A480
... 它只是窥视第 33 位。
我建议您使用以下内容:
#include <stdio.h>
#include <stdint.h> /* gives us uint64_t and UINT64_C() */
#include <inttypes.h> /* gives us PRIu64 */
int main(void) {
uint64_t d = UINT64_C(5250000000);
printf("%"PRIu64"\n", d);
return 0;
}
uint64_t
在任何系统上都保证是 64 位无符号的。UINT64_C
将附加正确的后缀(通常是UL
或ULL
)。PRIu64
将为 64 位无符号指定正确的格式字符串。
在我的 64 位系统上,在预处理器 (gcc -E
) 之后看起来像这样:
int main(void) {
uint64_t d = 5250000000UL;
printf("%""l" "u""\n", d);
return 0;
}
对于 32 位构建,它看起来像这样 (gcc -E -m32
):
int main(void) {
uint64_t d = 5250000000ULL;
printf("%""ll" "u""\n", d);
return 0;
}