【问题标题】:When converting to unsigned, the standard says "the least unsigned integer" is the result. Why does "least" matter here?当转换为无符号时,标准说“最小的无符号整数”是结果。为什么“最小”在这里很重要?
【发布时间】:2018-11-07 00:18:34
【问题描述】:

C++ 标准在[conv.integral/2] 中说,关于整数转换为无符号:

如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模 2n 其中 n 是用于表示无符号类型的位数)。

我的问题是,为什么会有“least”这个词?有没有可能有多个结果,我们需要从中选择一个?

【问题讨论】:

  • 如果(unsigned int)-135184372088831 就没有多大意义了,不是吗? (该数字与 -1 mod 2^32 一致)
  • @MM:当然。但这对于 unsigned int 来说是不可能的值(假设是 32 位 ints)
  • 选择的措辞对我来说似乎比“结果值是与目标类型范围内的源整数一致的无符号整数”更简单
  • @M.M:好的 :) 对我来说,你的措辞要好得多,因为意图更清楚。但也许只有我。

标签: c++


【解决方案1】:

有无数个整数等于任何值 k 模 2n。有k、k+2n、k+2*2n、k+3*2n、k-2 n、k-2*kn

其中一个是最小的无符号(正)值。

部分 C++ 标准在数学中指定。我相信这是其中之一。

【讨论】:

  • 是的,但只有k 是可能的,不是吗?所有其他候选人都超出范围。
  • @geza 将 500 传递给无符号 8 位类型,或 -1 传递给任何无符号类型。
  • 抱歉,我的问题可能不够清楚。我的意思是,只有一个数字可以满足一致性,并且在范围内。为什么我们需要说“最少”。但现在我看到标准的作者并没有考虑到“范围内”的要求。对我来说,这只是令人困惑,因为默认情况下我不会考虑超出范围的结果。
  • @geza 实际上是他们指定范围的方式。
猜你喜欢
  • 2020-04-07
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 2016-02-17
  • 2017-04-22
  • 2012-03-23
  • 2022-06-28
相关资源
最近更新 更多