double dVal;
int iVal = -7;
unsigned long ulVal = 1000;
dVal = iVal * ulVal;
printf("iVal * ulVal = %lf\n", dVal);


有人可以逐步解释如何获得4294960296.000000吗?


首先是将iVal的符号更改为未签名或升级
ulVal乘以ulVal类型之前?
另外,如果我们将iVal和ulVal相乘,则超出了long类型的范围
然后将乘法运算的值存储到double变量(因此我们可以进行转换
再次)。但是当双精度类型时,我们如何知道要取整哪个值
是0附近最精确的,而我们从0开始的距离
相邻数字之间更大?

最佳答案

这真的很简单:

iVal从int提升为unsigned long。因此,它的值-7(是2的补码)变成了一个正值0xFFFFFFF9(即4294967289)(至少在您的特定系统上)。

当乘以1000时,它会溢出无符号长整数,因此它不是4,294,967,289,000(0x3E7 FFFF E4A8)的结果,而是以0xFFFFE4A8(429960296)结尾。

然后将其转换为双精度字,得到最终答案。尾随零是因为float的值略高于429960296,因为它是由printf舍入到6位数字的分数之和构成的。

关于c++ - c中的类型提升和转换,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39914622/

10-09 15:36