你必须知道的C语言问题(11)

问:如下代码,计算结果为什么不符合预期?

#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即可。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值