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

在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位?

52500000000x1 38EC A480 …它只是窥视第33位。

我建议您使用以下内容:

 #include  #include  /* gives us uint64_t and UINT64_C() */ #include  /* 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; }