c++ - 将 float 的 SIGILL 转换为固定的转换

标签 c++ arm porting

运行以下代码后,我收到了 SIGILL。我真的不知道它有什么问题。

目标平台是 ARM,我正在尝试移植一个已知的库(其中包含此代码)

void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
    short sx = (short) (nX * 32);
    short sy = (short) (nY * 32);

    unsigned short *ux = (unsigned short*) &sx;
    unsigned short *uy = (unsigned short*) &sy;

    nFixed = (*ux << 16) | *uy;
}

如有任何帮助,我们将不胜感激。

提前致谢

最佳答案

有些 ARM 处理器有硬件浮点,有些没有,所以这个函数可能是为硬件浮点编译的,但是你的平台缺少浮点单元,所以浮点指令导致处理器报告非法指令。如果这是您的测试程序中的第一个浮点计算,那极有可能是问题所在。检查您平台的文档以找到您需要将哪个 -march 选项传递给 gcc,或者查看一些已经运行的程序使用的编译选项。

此函数没有定义的行为,并且如果没有指示所需的行为是什么,就很难提出改进建议。尝试这样的开始:-

void convertFloatToFixed(float nX, float nY, unsigned int &nFixed) {
    assert(nX * 32 < INT_MAX);
    assert(nY * 32 < INT_MAX);

    int sx = nX * 32;
    int sy = nY * 32;

    unsigned int ux = sx;
    unsigned int uy = sy;

    nFixed = (ux << 16) | uy;
}

我已经摆脱了指针转换,这(正如其他人所指出的)打破了严格的别名规则。我还使用了 int 而不是 shortshort auto 变量通常没有意义,因为它们在计算之前被扩展为 int。 (他们做得很好,因为将 short 移动 16 位不会很有用。)我添加了一些检查,以便您的调试版本可以确定 float 到整数的转换会溢出,导致未定义的行为。

关于c++ - 将 float 的 SIGILL 转换为固定的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585951/

相关文章:

c++ - 这里某处发生无限循环?

c++ - 用于替换顶点属性的 Opengl 着色器存储缓冲区对象

c++ - 如何使用 boost.process 重定向标准输入和标准输出

C++ 编译器命令顺序不一致

c - 错误 : #29: expected an expression in C

gcc - (arm-none-eabi-gcc) 从引导加载程序 + 2 x 固件镜像创建 .elf 二进制文件

php - 我应该升级到 PHP 5.3 吗?

java - 项目移植到 android 和源管理

c - 如果我不小心在 ARM 上运行 x86 二进制文件,如何显示错误消息?

java - 如何将此自定义 MD5 Java 函数转换为 JavaScript