c++ - c中的类型提升和转换

标签 c++ c variables type-conversion implicit-conversion

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/

相关文章:

创建一个包含给定数量空格的字符串

c - 来自 sys/stat.h 的 S_ISXXX(m) 宏出现问题

javascript - 将 javascript 变量传递给 jquery

JavaScript 初学者变量混淆

android - 使用扩展的 Android OpenGL ES 2.0 是否支持顶点数组对象?

c++ - 将类型分配给 typename 关键字

c++ - 作为函数调用的一部分创建的临时对象何时被销毁?

c++ - arduino if语句给出错误

c - pthread_cond_broadcast 不起作用?

php - 基于日期变量通过 PHP 检索 MySQL 事件