将无符号值分配给整数数据类型
assigning an unsigned value to integer data type
我写了代码:
int a = -1U;
cout << a;
为什么输出是 -1 而不是 2^w-1?
例如:
long long a = -1U;
cout << a;
输出结果为
4294967295
-1U
是1U
的否定。由于 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
范围内。
我写了代码:
int a = -1U;
cout << a;
为什么输出是 -1 而不是 2^w-1?
例如:
long long a = -1U;
cout << a;
输出结果为
4294967295
-1U
是1U
的否定。由于 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
范围内。