3

在 c# 中,您可以将数字文字定义为 int 或 double

    Double var1 = 56.1;
    int var2 = 51;

这些是分配给文字的默认类型。然而,我正在开发的游戏引擎使用浮点数来表示位置、旋转等。当浮点数被分配一个文字双精度时,即float varFloat = 75.4;编译器会抛出一个错误,指出双精度文字需要是一个浮点数,这是正确的。因此,需要将双字面值转换为浮点数,即。float varFloat = 75.4f;. 但是,当给定一个 int 文字时,该 int 会隐式转换为浮点数。IE,

    float varFloat = 44; // This is fine.

我的问题是编译器是否足够聪明,可以意识到 44 应该是浮点文字?如果不是,这意味着每次访问文字时,它也在执行转换。在大多数情况下,这真的无关紧要。但是对于高性能代码,如果在所有地方都使用整数而不是浮点数,它可能会成为一个问题(即使它是一个小问题)。据我所知,在不经过源代码行的情况下,无法将这些文字更改为浮点数,这根本不值得花时间。

那么,编译器是否将 int 文字转换为 float 文字?如果不是,除了试图避免这种处理能力的浪费,还能做些什么呢?

4

2 回答 2

8

答案是肯定的。知道这一点很聪明。

这是一个具有此类任务的简单程序的反汇编 IL(由ILSpy提供)。从 ldc.r4 指令中可以看出,没有发生转换:

.method private hidebysig static 
    void Main (
        string[] args
    ) cil managed 
{
    // Method begins at RVA 0x2050
    // Code size 8 (0x8)
    .maxstack 1
    .entrypoint
    .locals init (
        [0] float32 x
    )

    IL_0000: nop
    IL_0001: ldc.r4 44
    IL_0006: stloc.0
    IL_0007: ret
} // end of method Program::Main
于 2013-04-23T13:15:11.570 回答
3

float 比 double “小”

当您尝试将 float 转换为 double 时,您可能会失去精度

看到这个:C:将双精度转换为浮点,保留小数点精度

C#也是如此

当你写 float x = 5; 编译器将在编译时将其转换为 float x = 5.0;

没有性能问题

于 2013-04-23T13:18:02.967 回答