double dVal;
int iVal = -7;
unsigned long ulVal = 1000;
dVal = iVal * ulVal;
printf("iVal * ulVal = %lf\n", dVal);
有人可以逐步解释如何获得 4294960296.000000 吗?
- 先做什么,将iVal的符号更改为unsigned或promotion 在与 ulVal 相乘之前转换为 ulVal 类型?
- 此外,如果我们将 iVal 和 ulVal 相乘,我们就会超出长类型的范围 我们将乘法的值存储到双变量(所以我们有转换 再次)。但是,当 double 类型时,我们如何知道要舍入到哪个值 0 附近最精确,距离 0 的距离最远 相邻数字之间较大?
最佳答案
这真的很简单:
iVal 从 int 提升为 unsigned long。因此,它的值 -7(作为二进制补码)变为正值 0xFFFFFFF9(即 4294967289)(至少在您的特定系统上)。
当乘以 1000 时,会溢出 unsigned long,因此结果不是 4,294,967,289,000 (0x3E7 FFFF E4A8),而是 0xFFFFE4A8 (429960296)。
然后将其转换为 double ,得到最终答案。尾随零是因为 float 的值略高于 429960296,因为它被构造为 printf 四舍五入到 6 位的小数之和。
关于c++ - c中的类型提升和转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39914622/