【问题标题】:Trying to understand how the casting/conversion is done by compiler,e.g., when cast from float to int试图了解编译器是如何完成转换/转换的,例如,当从 float 转换为 int 时
【发布时间】:2010-07-09 19:06:07
【问题描述】:

当浮点数被转换为整数时,编译器如何实现这种转换。 编译器是否屏蔽了浮点变量的部分内存,即编译器将哪部分内存插入以将剩余的部分传递给 int 变量。

我想这个问题的答案在于 int 和 float 如何在内存中维护。

但是它不是依赖于机器而不是依赖于编译器。当转换为较低类型时,编译器如何决定复制哪一部分内存(这是一个静态转换,对)。

我猜我对一些错误的信息感到困惑。

(我读过一些关于 tag=downcasting 的问题,关于它是强制转换还是转换的争论正在进行中,我对它的名称不太感兴趣,因为两者都是由编译器执行的,但是关于如何正在执行)。

... 谢谢

【问题讨论】:

  • 你指的是哪种编程语言?
  • 您可以使用 c++,但它是否与 c 或 c++ 的行为有任何差异。 (如果你不是指任何其他语言,除了 c/c++)

标签: downcast


【解决方案1】:

当谈论基本类型而不是指针时,就完成了转换。因为浮点和整数表示非常不同(通常分别是 IEEE-754 和二进制补码),所以不仅仅是屏蔽了一些位。

如果您想在不进行转换的情况下查看表示为 int 的浮点数,您可以执行以下操作(在 C 中):

float f = 10.5;
int i2 = (int*)&f;
printf("%f %d\n", f, i2);

【讨论】:

  • *(int*)&f 表达式具有未定义的结果,因为它违反了 C 的指针别名规则。在最新版本的 gcc 上通常无法正常工作。请参阅这篇文章,以获得对别名和正确方法的良好解释(内容大多不特定于 Cell,尽管它位于面向 Cell 的站点上):cellperformance.beyond3d.com/articles/2006/06/…
  • 好点。使用联合(无论如何在 C/C++ 中)可能是重新解释位的正确答案。但这无论如何都是无用的,所以我希望这个问题只是学术性的!但对于最初的问题,它实际上是在谈论整数和浮点数时发生的转换(改变位模式)。
  • 是的,如问题本身所述,仅用于理解目的。无论如何,您的回答有所帮助。谢谢
【解决方案2】:

大多数 CPU 架构提供本地指令(或多指令序列)来进行浮点整数转换。编译器通常只会生成这条指令。通常有更快的方法。这个问题有一些很好的信息:What is the fastest way to convert float to int on x86

【讨论】:

    猜你喜欢
    • 2012-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多