从32位系统上的结构读取一个long(C)

时间:2017-04-03 14:02:58

标签: c struct long-integer

在C中,我有一个带有成员“frequency”的结构,这是一个长的unsigned int。这段代码运行的硬件是32位。

struct在实例化时设置了值。

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位?是不是“长”应该将范围扩展到64位?

1 个答案:

答案 0 :(得分:4)

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;
}