从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位?
5250000000
是0x1 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
将附加正确的后缀(通常为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; }