【问题标题】:assigning an unsigned value to integer data type将无符号值分配给整数数据类型
【发布时间】:2021-11-11 07:04:20
【问题描述】:

我写了代码:

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

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

如:

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

输出结果为
4294967295

【问题讨论】:

  • 尝试启用编译器警告。您将收到有关可能的整数溢出的警告。
  • 2^w-1 超出了int a 的范围。
  • 检查 int 的范围是多少。这不是你想的那样。并且将 -1u 分配给 long long 将使任何代码审查失败。

标签: c++ unsigned-integer


【解决方案1】:

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

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


int a = -1U;

为什么输出是 -1 而不是 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 范围内。

【讨论】:

  • 怎么样(UINT_MAX +1),不应该是-1吗?
  • @BitthalMaheshwari “怎么样(UINT_MAX +1),不应该是-1吗?” --> “它” (-1U) 不是 (UINT_MAX +1)-1U 就像 -1 增加 (UINT_MAX +1)-1 + (UINT_MAX +1) --&gt; UINT_MAX。 "不应该是 -1" --> "it` (-1U) 是一个 unsigned 常量。unsigned 对象不能有像 -1 这样的负值。
  • @chux-ReinstateMonica -1U 是应用于无符号 1U 的一元运算符减号。 C++ 整数文字没有符号。查看其解析规则。
  • @ÖöTiib 回复:“-1U 是应用于无符号 1U 的一元运算符减号。”,此答案以“-1U 是 1U 的否定”开头,因此已涵盖。
  • @BitthalMaheshwari 对于 unsigned 类型,文字的解析和对变量的赋值都以相同的方式发生:如果正整数值/文字对于它被分配的类型来说太大了value % 2^bitWidth^ 解释为幂,而不是语言中的 XOR)——这意味着截断多余的最高有效位。对于负值,2^bitWidth 会根据需要添加多次,以使值进入类型范围——很好的二进制补码,因为这是标识(或者再次只是切断多余的 MSB)。标准要求对无符号类型进行这种处理。
猜你喜欢
  • 2017-03-04
  • 1970-01-01
  • 2015-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多