【发布时间】:2017-04-03 14:02:57
【问题描述】:
在 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的值超出了 32 位无符号整数的范围。你从哪里得到代码?它似乎不是为 32 位系统设计的。 -
使用
long long和"%llu"而不是long。或者为了避免任何歧义,包括stdint.h并将frequency定义为uint64_t。 -
ptr->frequency是写(*ptr).frequency的常用方式。这两种表示法是严格等价的。 -
也许你可以包含
stdint.h并从那里使用 64 位类型 -
与 C 中几乎所有的整数一样,
long的大小取决于编译器。 GCC 通常在 64 位系统上将其设置为 64 位,但在 32 位系统上设置为 32 位。 Microsoft Visual C(++) 编译器在 32 位和 64 位系统上都有long为 32 位。如果您想要更大的类型,请使用long long,它保证至少为 64 位。请参阅例如this type reference 了解更多信息。
标签: c struct long-integer