我有一个结构变量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,但它给了我一个奇怪的负数。
答案 0 :(得分:7)
13230000014
大于32位整数,因此如果int
为32位,则无法将其存储在int
中。如果您使用的是64位计算机,则可以尝试转换为long
而不是int
。请注意,long
不能保证为64位。
编辑:根据评论,int64_t
和long 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
将自动截断小数。我在上面的例子中保留了它以更好地匹配您的代码,但只知道它是不必要的。