无符号和有符号整数的 C++ 算术类型转换
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" 在这种情况下)在操作发生之前应该是 "promoted" 到一个无符号整数。这一定不是这种情况,因为 (i + x) 的第一个结果将是 (5 + (2^31 - 1 - 3)) = 4294967297 而不是 2。我在这里遗漏了什么吗?在我看来,只有最终结果被转换为无符号整数,而不是初始操作数。
你的错误是假设计算是 (5 + (2^31 - 1 - 3))
。 -3
的 unsigned
解释基于最大值 2^32 - 1
(UINT_MAX
),而不是 2^31 - 1
(INT_MAX
)。所以你取 2^32 - 1 - 3
(UINT_MAX - 3
),加上 5,因为它超过了 UINT_MAX
,它又回到了 2
,至少在你的补码系统上是这样32 位 int
s.
代码:
#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" 在这种情况下)在操作发生之前应该是 "promoted" 到一个无符号整数。这一定不是这种情况,因为 (i + x) 的第一个结果将是 (5 + (2^31 - 1 - 3)) = 4294967297 而不是 2。我在这里遗漏了什么吗?在我看来,只有最终结果被转换为无符号整数,而不是初始操作数。
你的错误是假设计算是 (5 + (2^31 - 1 - 3))
。 -3
的 unsigned
解释基于最大值 2^32 - 1
(UINT_MAX
),而不是 2^31 - 1
(INT_MAX
)。所以你取 2^32 - 1 - 3
(UINT_MAX - 3
),加上 5,因为它超过了 UINT_MAX
,它又回到了 2
,至少在你的补码系统上是这样32 位 int
s.