C中的双到int转换

Reb*_*375 0 c double int type-conversion

我有一个结构变量运行状况,可以作为disk-> health访问,它是double类型.我试图将其打印为double,然后将其转换为int并再次打印.

printf("The disk health in loop is: %lf\n", disk_ptr->health);
//result is: 13230000014.560297
printf("The disk health in loop is: %i\n", (int) floor(disk_ptr->health));
//result is: -2147483648
printf("The disk health in loop is: %d\n", (int) floor(disk_ptr->health));
//result is: -2147483648
Run Code Online (Sandbox Code Playgroud)

上面的代码是我正在使用的.我希望输出第二个结果:13230000014,但它给了我一个奇怪的负数.

Adr*_*ian 7

13230000014大于32位整数,因此int如果int是32位,则不能将其存储在32位.如果您有64位计算机,则可以尝试转换为a long而不是int.请注意,long不保证是64位.

编辑:根据评论,类型int64_tlong long保证是64位,所以你可以使用那些.

  • 不要长时间使用.Linux在Linux上是64位,在Windows上是32位.在stdint.h中使用long long或其中一个特定长度类型 (3认同)
  • @tloach或者更好``stdint.h`的`int64_t`.顺便说一下,这就是为什么`floor()`返回`float`或`double`,因为整数溢出. (2认同)

ra1*_*ter 7

你说你想要它打印13230000014,但这个值大于int可以容纳的最大值,实际上2^31 - 1(在大多数系统上).您需要停止使用说明%i符并切换到更大的说明符,例如%lld,并转换为long long替换.

像这样:

printf("The disk health in loop is: %lld\n", (long long) floor(disk_ptr->health));
Run Code Online (Sandbox Code Playgroud)

请注意,您必须更改转换和格式说明符,或者printf仍将参数视为int.

如果你想更明确地使用64位整数,你可以考虑包括stdint.h,并进行转换int64_t而不是a long long.

编辑:请注意,在您的情况下,楼层调用是多余的,因为强制转换long long会自动截断小数.我在上面的示例中将其保留为更好地匹配您的代码,但只是知道它没有必要.