使用数据类型int64_t在C中进行十六进制乘法的问题

时间:2011-03-15 19:40:13

标签: c

当我尝试使用数据类型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

请帮助我。

4 个答案:

答案 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;
}