[英]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;
}
}
我希望a
和b
具有相同的值,但是當我運行它時,我得到這個輸出:
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
。
看來這個修復程序修復了這個問題,至少在VS 2015中是這樣:
但似乎VS 2008,2010,2013仍然受到這個bug的影響。
資料來源:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.