从 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 位吗?

52500000000x1 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 将附加正确的后缀(通常是 ULULL)。
  • 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;
}