C中的双到int转换

时间:2015-07-17 16:45:18

标签: c int type-conversion double

我有一个结构变量health,可以作为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

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

2 个答案:

答案 0 :(得分:7)

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

编辑:根据评论,int64_tlong long类型保证为64位,因此您可以使用它们。

答案 1 :(得分: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));

请注意,您必须同时更改转换和格式说明符,否则printf仍会将参数视为int。

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

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