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
相关产品推荐
相关产品推荐

