【问题标题】:Range of integers imposed by the C++ standardC++ 标准规定的整数范围
【发布时间】: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++


【解决方案1】:

我会在这里尝试一个答案,欢迎更正:

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

这意味着无符号整数的范围是[0, 2^n - 1],否则我不知道您如何强制执行此操作。

[basic.fundamental]#3 — 重点是我的

对于每一种标准有符号整数类型,都有一个对应的(但不同的)标准无符号整数类型:“unsigned char”、“unsigned short int”、“unsigned int”、“unsigned long int”和“unsigned long long int”,每个都占用相同的存储量,并且与对应的有符号整数类型具有相同的对齐要求;也就是说,每个有符号整数类型都具有与其对应的无符号整数类型相同的对象表示。 [...] 有符号整数类型的非负值的范围是对应无符号整数类型的子范围相同值在两种类型中的表示是相同的,并且每个对应的有符号/无符号类型的值表示应相同。 [...]

据我所知,这些是链接有符号和无符号整数的唯一约束:

  • 第一点是相关的无符号和有符号整数使用相同的位数表示n
  • 第二点是带符号整数的任何正值在相关的无符号类型中具有相同的表示。

以下三种表示有符号整数的方法满足这些约束:Sign & AmplitudeOnes' complementTwo's complement

当我读到它时,标准中没有足够的约束来强制执行有符号整数的二进制补码表示。

【讨论】:

    猜你喜欢
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多