You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位环境下向负无穷舍入float转int的内联汇编兼容方案

问题根因

你遇到的编译报错是因为64位版本的MSVC编译器已经完全移除了对__asm内联汇编语法的支持,原有的x87指令集实现逻辑无法直接在64位环境下编译运行。

原有代码的核心逻辑是实现float转int时向负无穷舍入(即floor取整),完全可以用标准库或编译器内置功能替换,不需要手写汇编。

适配方案

直接替换原有两个宏定义即可,不需要修改业务调用代码,以下是两种可选实现:

方案1:标准库实现(兼容性最好)

使用C标准库的floorf函数实现向负无穷取整,行为和原有汇编逻辑完全一致:

// 删掉原来的PR_FLOAT_TO_INTASM、PR_FLOAT_TO_INT宏,替换为以下内容
#include <math.h>
#define PR_FLOAT_TO_INT(inreal, outint)                         \
{                                                               \
    (outint) = (long)floorf((float)(inreal));                   \
}

该实现不需要依赖原来的全局临时变量PR_FCNV、PR_ICNV,可以直接删掉这两个全局变量的定义。

方案2:编译器内置实现(性能更高,适合游戏场景)

如果对性能要求极高,可以使用MSVC的SSE内置函数实现,避免标准库函数调用开销:

#include <intrin.h>
#define PR_FLOAT_TO_INT(inreal, outint)                                 \
{                                                                       \
    __m128 val = _mm_set_ss((float)(inreal));                           \
    (outint) = (long)_mm_cvtss_si32(_mm_floor_ss(val, val));            \
}
效果验证

两种方案的输出结果和原有汇编逻辑完全一致:

  • 正数输入:2.1f → 2,2.9f → 2
  • 负数输入:-2.1f → -3,-2.9f → -3

内容的提问来源于stack exchange,提问作者dracaryS

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 00:27:04