为什么优化会将 double 转换为无符号 int 的结果?

Why does optimization change the result of double to unsigned int conversion?

提问人:aganm 提问时间:11/6/2023 更新时间:11/6/2023 访问量:62

问:

给定此代码:(https://godbolt.org/z/qGneEne7x)

#include <stdio.h>
#include <xmmintrin.h>

int main ()
{
    double d[2] = { 161785254.0, -215713672.0 };
    int i[4];
    unsigned u[4];

    __m128d vd = _mm_loadu_pd(d);
    __m128i vi = _mm_cvtpd_epi32(vd);
    _mm_storeu_si128((void *)i, vi);
    _mm_storeu_si128((void *)u, vi);

    printf("Doubles to convert            : %.1f %.1f\n", d[0], d[1]);
    printf("\n");
    printf("SIMD double to signed int     : %i   %i\n", i[0], i[1]);
    printf("SIMD double stored to unsigned: %u   %u\n", u[0], u[1]);
    printf("\n");
    printf("Scalar double to signed int   : %i   %i\n", (int)d[0], (int)d[1]);
    printf("Scalar double to unsigned     : %u   %u\n", (unsigned)d[0], (unsigned)d[1]);
}

为什么优化会更改标量代码中双号到无符号转换的结果?

这是它用 -O0 打印出来的内容:

Doubles to convert            : 161785254.0 -215713672.0

SIMD double to signed int     : 161785254   -215713672
SIMD double stored to unsigned: 161785254   4079253624

Scalar double to signed int   : 161785254   -215713672
Scalar double to unsigned     : 161785254   4079253624

一切都如预期的那样。

打开 -O1 并将标量变为 unsigned 变为零:

Scalar double to unsigned     : 161785254   0

为什么?

双无 符号

评论


答:

3赞 supercat 11/6/2023 #1

在某些平台上,以与定义后者的所有情况下产生相同结果的方式进行处理可能比以可能为某些此类转换产生不同结果的方式进行处理成本更高。此外,对于某些任务,当超出范围时,让这样的计算陷阱可能比让它们产生无意义的值更有用。该标准没有试图预测替代行为可能比 更有用的所有情况,而是简单地放弃了对任何情况的管辖权,除了简单的数值转换将在 范围内产生结果的情况。(unsigned)d(unsigned)(int)ddunsigned(unsigned)(int)dunsigned int