C中的double到int的转换

Double to int conversion in C

我有一个结构变量 health 可以作为 disk->health 访问,它是双精度类型。我正在尝试将其打印为 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,但它却给了我一个奇怪的负数。

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

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

你说你想让它打印 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 会自动截断小数点。我把它留在上面的例子中是为了更好地匹配你的代码,但我知道这不是必需的。