【问题标题】:Double to int conversion in CC中的double到int转换
【发布时间】:2015-10-07 11:12:25
【问题描述】:

我有一个结构变量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,但它给了我一个奇怪的负数。

【问题讨论】:

  • #include <math.h>了吗?
  • 是的,我确实包含了它
  • 我怀疑你的ints只有32位,最多只能表示2147483648。
  • 这个数字似乎太大,int 无法处理。
  • 截断值,(int)disk_ptr->health就够了。

标签: c int type-conversion double


【解决方案1】:

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

【讨论】:

  • 只需(long long)disk_ptr->health 就足够了。 floor 调用是多余的
【解决方案2】:

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

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

【讨论】:

  • 不要长时间使用。 Long 在 Linux 上是 64 位,但在 Windows 上是 32 位。使用 long long 或 stdint.h 中的特定长度类型之一
  • @tloach 或者更好的 int64_t 来自 stdint.h。顺便说一句,这就是为什么floor() 返回floatdouble,因为整数溢出。
  • @Adrian 我建议您编辑您的答案,将long 替换为保证包含64 位数字的long long
  • @Adrian 在我的电脑上,sizeof(long) 返回 4,sizeof(long long) 返回 8,根据标准,这是完全有效的。我会推荐long longint64_t
猜你喜欢
  • 2013-05-31
  • 1970-01-01
  • 1970-01-01
  • 2012-06-01
  • 1970-01-01
  • 2015-02-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多