将无符号值分配给整数数据类型

assigning an unsigned value to integer data type

我写了代码:

int a = -1U;
cout << a;

为什么输出是 -1 而不是 2^w-1?

例如:

long long a = -1U;
cout << a;

输出结果为
4294967295

-1U1U的否定。由于 unsigned 不能有负值,结果会增加 (UINT_MAX + 1)。结果 UINT_MAX 在 OP 的机器上是 4294967295。

在 OP 的两种情况下,代码都使用 4294967295u 初始化有符号整数变量。


int a = -1U;

Why the output is -1 not 2^w-1?

2w - 1(w 是位宽 32)超出了 int a 的范围所以 a 不能有那个值。

将超出范围的值分配给 int 会导致实现定义的行为。在 OP 的机器上,将 4294967295 分配给 int “包装”到 -1.


long long a = -1U;

long long a = -1U; 类似于 long long a = 4294967295;(见上文),因此 a 的值为 4294967295,完全在 long long 范围内。