【发布时间】:2018-02-05 05:25:14
【问题描述】:
这个问题是关于 C++ 标准对基本整数类型范围的规定。在 C++17 标准中,基本类型上的点 6.9.1 有一个点 4,它说:
无符号整数应遵守算术模数定律
2^n其中n是该值表示中的位数 整数的特定大小。
在 C 标准中,它只说如果[0, max] 是可以用无符号整数表示的范围,则所有超出此范围的操作都以range + 1 为模减少。它从来没有说range + 1 应该是 2 的幂。
C++ 标准的这个引用是否意味着所有无符号整数都具有[0, 2^n - 1] 类型的范围?我们可以从这一点推断出所有有符号整数都有[-2^(n/2), 2^(n/2) - 1]形式的范围吗?
我在标准中没有看到这样说,但标准的前面引用似乎暗示了这种事情。
PS:这个问题与这里给出的重复问题不同。相关的问题是关于为什么标准中没有强制执行二进制补码。我的问题是关于实际标准中的内容。
【问题讨论】:
-
有符号类型的标准中没有任何内容,这就是为什么环绕有符号整数是未定义的行为。
-
你的报价只是关于无符号整数,所以我不明白你是如何得出你的第一个结论的(子弹)?至于第二个,我看不到 unsigned 范围
[0, 2^n-1]在这里与二进制补码有什么关系? -
@Holt:我已经纠正了我的问题。谢谢。
标签: c++