当我尝试使用数据类型int64_t执行16位乘以16位的十六进制乘法时,显示的结果限制为32位,并且从不显示第33位(如果存在),尽管我正在定义操作数以及结果是64位长。
以下是我正在使用的简单代码:
#include<stdio.h>
#include <stdint.h>
int main()
{
int64_t a, b, r;
a = 0xabcd;
b = 0xdbca;
r = a * b * 3;
printf("%x", r);
return 0;
}
打印出来的结果是:ba7fcc46
预期结果为:1ba7fcc46
请帮助我。
答案 0 :(得分:4)
int64_t
的格式说明符取决于平台(Windows上的%I64x
,任何其他平台上的%llx
,YMMV)。所以有一个你可以使用的宏看起来很丑,但可以在任何系统上运行:
#include <inttypes.h>
...
printf("%" PRIx64 "\n", r);
如果您不介意您的代码无法在Windows上运行,则可以使用%llx
。
(已编辑;宏名称错误)
答案 1 :(得分:2)
一种流行的解决方案是将%llx
用于printf
格式。 ll
表示long long
(几乎所有系统都是64位长),尽管这不是便携式的。
便携式(但不太清晰)解决方案是使用@ anatolyg的答案,在此重印:
#include <inttypes.h>
// ...
printf("%" PRIx64 "\n", r);
答案 2 :(得分:0)
我们做的是这个
#if __WORDSIZE == 64
printf("%lx\n", r);
#else
printf("%llx\n", r);
#endif
这使64位和32位机器的类型保持正确。 BTW这是针对gcc / g ++的。不确定它是否便携
答案 3 :(得分:0)
实际上,合规程序只有几种方法可以专门打印int64_t
,它们都看起来像这样:
#include <stdio.h>
#include <inttypes.h>
void f(int64_t x) {
printf("Value %30" PRId64 "\n", x);
}
int main(void) {
f((int64_t)1000000000 * 1000000000);
return 0;
}