簡體   English   中英

整數提升在c ++中未簽名

[英]Integer promotion unsigned in c++

int main() {
    unsigned i = 5;
    int j = -10; 
    double d = i + j;
    long l = i + j;
    int k = i + j;
    std::cout << d << "\n";     //4.29497e+09
    std::cout << l << "\n";     //4294967291
    std::cout << k << "\n";     //-5
    std::cout << i + j << "\n"; //4294967291
}

我相信在執行算術運算符之前, signed int會被提升為unsigned
-10將轉換為無unsigned integer underflowunsigned integer underflow這是正確的術語?? ),並在添加后打印4294967291

為什么在打印-5int k的情況下不會發生這種情況?

執行算術運算符的過程涉及轉換以使兩個值具有相同的類型。 此過程的名稱是查找公共類型 ,對於intunsigned int ,轉換稱為常規算術轉換 在這種特殊情況下不使用促銷一詞。

i + j的情況下,通過UINT_MAX + 1添加UINT_MAX + 1 ,將int轉換為unsigned int 所以i + j的結果是UINT_MAX - 4 ,在你的系統上是4294967291

然后,您將此值存儲在各種數據類型中; 唯一需要進一步解釋的輸出是k UINT_MAX - 4不能適合int 這稱為超出范圍的賦值 ,結果值是實現定義的。 在您的系統它顯然分配int具有相同的表示作為值unsigned int的值。

j在添加之前將被轉換unsigned int ,這發生在你所有的i + j 快速實驗。

int k = i + j的情況下。 與您的實施和我的實施情況一樣, i + j產生: 4294967291 4294967291大於std::numeric_limits<int>::max() ,行為將是實現定義的。 為什么不嘗試將4294967291分配給int

#include <iostream>

int main(){
    int k = 4294967291;
    std::cout << k << std::endl;
}

生產:

-5

可以看出這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM