【问题标题】:Is it safe to assign -1 to an unsigned int to get the max value?将 -1 分配给 unsigned int 以获得最大值是否安全?
【发布时间】:2012-04-25 06:56:54
【问题描述】:

如果我需要获取最大值,将 -1 分配给 unsigned int 或其他 unsigned c++ 数据类型是否安全?

在任何情况下它不会给我一个无符号数据类型可以包含的最高值吗?

【问题讨论】:

标签: c++ unsigned


【解决方案1】:

为了安全起见,请使用std::numeric_limits<unsigned int>::max()。 将 -1 转换为 unsigned 可以在主流平台上使用,但标准 AFAIR 不保证。

UPD:我会纠正自己的。 (unsigned)-1在C中要求为UINT_MAX,见答案here

【讨论】:

  • 将 -1 转换为 unsigned 类型保证符合标准。问题是意图并不那么清楚。使用std::numeric_limits<unsigned int>::max() 非常清楚。也很冗长,但很清楚。
  • 您的更新引用了一个 c 问题,而该问题又引用了 c 标准。 c++ 标准规定无符号整数“应遵守算术模 2^n 的规律”。最终效果是一样的。
【解决方案2】:

认为你可以在任何 2 的补码机器上使用 -1(我认为现在这就是一切)。

【讨论】:

  • 听说过嵌入式系统吗?
  • 来自标准:“声明为无符号的无符号整数应遵守算术模 2^n 的定律,其中 n 是该特定大小的整数的值表示中的位数。”换句话说,无符号整数即使在 1s 补码机器上也是 2s 补码。
  • @DavidHammen 我理解你想说的(这是正确的),但是 2s 补码定义了一种表示负数的方式。由于无符号类型根本不能表示负数,因此它们不能是 2s 补码。您可能的意思是从有符号到无符号的转换表现得好像 2s 补码位模式用于无符号。
  • @JamesKanze:是的,最好说机器如何表示负数与无符号整数在 c++ 中的行为无关,并且从有符号到无符号的转换就像机器使用的那样进行2s 补码表示负数。
  • @supercat:UINT_MAX+1 产生零的原因正是因为标准规定了模 2^n 算术。 -1 和 UINT_MAX 是相同的数字(模 2^n),其中 n 是无符号整数中的位数。
猜你喜欢
  • 2018-07-02
  • 2021-09-12
  • 2011-12-15
  • 2019-10-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-23
相关资源
最近更新 更多