gpt4 book ai didi

c++ - 当我在 C++ 中将 float 变量分配给 int 变量时会发生什么?

转载 作者:太空宇宙 更新时间:2023-11-04 13:41:43 25 4
gpt4 key购买 nike

首先让我说一下,我对 Assembly 了解不多,但这是我想知道的事情。

假设我有一段 C++ 代码,如下所示:

float f = 34.2;
int i;

i = f;

很明显,当这段代码被执行时,f (34.2) 的值将被转换为整数值 (34) 并分配给 i .

我的问题是这种转换是如何发生的,我的意思是它是在运行时发生的,所以在运行时有一段代码嵌入到可执行文件中,如下所示:f 被分配给 i,现在我知道f是一个 float ,i是一个整数,所以我应该做的是转换中的位f 变量为整数表示,然后将其赋值给i

或者会发生什么情况是在编译时 i = f 将直接替换为将 float 转换为整数的代码?

最佳答案

你的代码是

float f = 34.2;
int i;

i = f;

只需调试并查看反汇编窗口。在调试版本中(因此不会发生常量传播,并且变量不会完全优化):

float f = 34.2;
01175498 movss xmm0,dword ptr ds:[117DF70h]
011754A0 movss dword ptr [f],xmm0
int i;

i = f;
011754A5 cvttss2si eax,dword ptr [f]
011754AA mov dword ptr [i],eax

可以看到指令cvttss2si (Convert with Truncation Scalar Single-Precision Floating-Point Value to Integer)正在执行。

这是 Mats Petersson 在他的评论中所说的。该指令会将 float 转换为其整数表示形式,并向 0 舍入,而不管当前舍入模式如何。

输入操作数为 32 位宽,并被解释为 IEEE 单精度,因为 x86 使用 float 的格式。

(针对没有 SSE1/SSE2 的 x86 的 C++ 编译器必须将 x87 舍入模式更改为截断,然后返回到先前的值;这就是为什么 SSE1 和 SSE2 包含带截断转换指令但不包含其他舍入模式覆盖的原因,直到SSE4.1 roundss/roundsd 以浮点结果实现 floor/ceil/trunc/nearbyint。C++ 需要 FP->integer 转换以截断为零,与默认舍入模式分开时产生一个 FP 结果。)

大多数其他现代 ISA 都有一条指令 FP->int 转换和截断指令,尽管非 CISC 只能在寄存器之间操作,并且需要在调试版本中单独加载和存储。

关于c++ - 当我在 C++ 中将 float 变量分配给 int 变量时会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27458201/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com