【问题标题】:Does the C++ standard require the maximum of unsigned integer numbers to be of the form 2^N-1?C++ 标准是否要求无符号整数的最大值为 2^N-1 形式?
【发布时间】:2016-04-23 20:47:16
【问题描述】:

对于T 使得std::is_integral<T>::value && std::is_unsigned<T>::valuetrue,C++ 标准是否保证:

std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1

在数学意义上?我正在寻找基于标准引用的证明。

【问题讨论】:

标签: c++ c++11 standards language-lawyer unsigned


【解决方案1】:

C++ 通过引用 C 标准来指定整数类型的范围。 C 标准说:

对于unsigned char以外的无符号整数类型,对象表示的位应分为两组:值位和填充位(后者不需要任何一个)。如果有 N 个值位,则每个位应代表 1 和 2N − 1 之间的 2 的不同幂,以便该对象类型应能够 使用纯二进制表示表示从 0 到 2N − 1 的值;这应称为值表示。未指定任何填充位的值。

此外,C++ 要求:

无符号整数应遵循算术模 2 定律n 其中 n 是该特定大小的值表示中的位数整数。

综上所述,我们发现无符号整数类型有 n 个值位,表示范围 [0, 2n sup>) 并遵守算术模 2n 的定律。

【讨论】:

  • 那么为什么他们一次说“对象表示中的值位”,另一次说“值表示中的位”?
  • @MarcvanLeeuwen:这两种语言标准发展出的措辞风格略有不同,但本质上是相同的想法。第一个引用来自 C11,第二个来自 C++ WD。​​span>
【解决方案2】:

我相信[basic.fundamental]/4 (N3337) 暗示了这一点:

声明为unsigned 的无符号整数应遵守算术模2^n 的定律,其中n 是数字 该特定整数大小的值表示中的位数。

【讨论】:

  • 确实是直接从MAX = -1 = 2^n - 12^n
  • 如果 MAX 小于 2^n-1,则引用部分暗示 MAX+1 不​​为零,因此 MAX 不是最大值 - 这将是矛盾的。
  • 严格来说“遵守算术模数定律2^n”描述的是算术运算符和类型的相等关系,而不是可以采用的值集。在数学上,模算术中使用的值是整数的同余类,并且可以使用类中任何完整的代表值集来实现。虽然我知道它不会(并且更喜欢调用未定义的行为),但标准可以选择规定 signed int 也遵守算术模 2^n 的定律(然后只有 @987654330 @etc 会区分 intunsigned)。
猜你喜欢
  • 2022-11-18
  • 2016-04-24
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 2020-05-01
  • 1970-01-01
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多