[英]C++ Arithmetic Type Conversion with unsigned & signed integers
碼:
#include<iostream>
using std::cout; using std::endl;
int main()
{
unsigned int i = 5;
int x = -3;
cout << "(i + x) = " << (i + x) << endl;
cout << "Set x to -6" << endl;
x = -6;
cout << "(i + x) = " << (i + x) << endl;
}
輸出:
(i + x) = 2
Set x to -6
(i + x) = 4294967295
在此示例中,由(i + x)返回的結果的類型是無符號整數,但是,我認為在進行算術類型轉換時,該有符號整數(在這種情況下為變量“ x”)應該被“提升”。運算之前將其轉換為無符號整數。 事實並非如此,因為(i + x)的第一個結果將是(5 +(2 ^ 31-1-3))= 4294967297而不是2。在這里我缺少什么嗎? 在我看來,只有最終結果會轉換為無符號整數,而不是初始操作數。
您的錯誤是假設計算為(5 + (2^31 - 1 - 3))
。 -3
的unsigned
解釋基於最大值2^32 - 1
UINT_MAX
( UINT_MAX
),而不是2^31 - 1
INT_MAX
( INT_MAX
)。 因此,您要使用2^32 - 1 - 3
UINT_MAX - 3
( UINT_MAX - 3
),加5,由於超出了UINT_MAX
,它至少會在您的補碼系統中使用32位int
s返回到2
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.