在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位?
答案 0 :(得分:4)
5250000000
是0x1 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
会附加正确的后缀(通常为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;
}