繁体   English   中英

将uint32_t转换为uint64_t导致不同的值?

[英]casting uint32_t to uint64_t results in different value?

使用Visual Studio 2015 C ++,14.0.25431.01更新3.我的代码中有意外行为。 使用64位编译并运行,发布:

#include <iostream>
#include <stdint.h>

int main(int, char**) {
    for (uint32_t i = 1; i < 3; ++i) {
        uint32_t a = i * 0xfbd1e995;
        uint64_t b = a;

        std::cout << a << " 32bit" << std::endl;
        std::cout << b << " 64bit" << std::endl;
    }
}

我希望ab具有相同的值,但是当我运行它时,我得到这个输出:

4224838037 32bit
4224838037 64bit
4154708778 32bit
8449676074 64bit

看起来编译器用64位乘法取代了32位乘法。 允许这样做,还是编译器错误? g ++和clang都给了我期望的数字。

编辑:我用更简单的版本更新我的代码有相同的问题。 另外, 我刚刚提交了一份错误报告

我可以在VS2010上重现这一点,其直接原因是:

add ebx, 5BD1E995h  ; this is x
add rdi, 5BD1E995h  ; this is a 64bit version of x

由于它是一个64位的加法,它只会进入高32位。 至少比召唤64位乘法更有意义,它可能是诱导变量消除的一个极端情况,但这只是推测。

同样有趣的是,它甚至不会通过错误编译来保存演员表。 正确的值就在rbx

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM