簡體   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