运行以下代码后,我收到了 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
而不是 short
。 short
auto 变量通常没有意义,因为它们在计算之前被扩展为 int
。 (他们做得很好,因为将 short
移动 16 位不会很有用。)我添加了一些检查,以便您的调试版本可以确定 float 到整数的转换会溢出,导致未定义的行为。
关于c++ - 将 float 的 SIGILL 转换为固定的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2585951/