[英]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 underflow
無unsigned integer underflow
( 這是正確的術語?? ),並在添加后打印4294967291
。
為什么在打印-5
的int k
的情況下不會發生這種情況?
執行算術運算符的過程涉及轉換以使兩個值具有相同的類型。 此過程的名稱是查找公共類型 ,對於int
和unsigned 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.