问:如下代码,计算结果为什么不符合预期?
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char* argv[])
{
uint32_t a = 100000;
uint32_t b = 100000;
uint32_t c = 100000;
uint64_t d;
uint64_t e;
d = (a*b);
e = (a*b)/c;
printf("d: %ld\r\ne: %ld\r\n", d, e);
return 0;
}
运行输出:
d: 1410065408
e: 14100
答:计算过程中数据发生了溢出,14行,a和b都是uint32_t类型,a*b计算的结果也按uint32_t类型存储,这里计算结果超出了4字节,会先截短为4字节然后再赋值给d。15行类似,a*b得到的结果截短后再除c。
问:如何处理这种情况?
答:稳妥的方式是将参与计算的变量(位宽)定义的足够大,当然本例中只需将a或b定义为uint64_t即可。