【问题标题】:What is maximum guaranteed range of N-bit signed integer?N位有符号整数的最大保证范围是多少?
【发布时间】:2019-11-09 07:16:39
【问题描述】:

一些背景:

  • 在 C++20 之前,C++ 标准允许任何有符号整数表示,并且 N 位有符号整数的最小保证范围是从 -(2^(N-1) - 1)+2^(N-1) - 1
  • C++20 标准建议(如@Sneftel 所述) 允许唯一的表示具有从-2^(N-1)+2^(N-1) - 1 的保证范围。
  • 据我了解,最小值-最大值的范围必须是连续的。

我试图找到 N 位有符号整数的最大范围的任何引号,但没有找到。

所以我想知道(就 C++ 而言):

  1. 假设 N 位有符号整数的最大可能范围限制在 -2^(N-1)+2^(N-1) 是否正确?能不能再宽一点?
  2. 它会受到底层平台位实现的影响 - 例如“3-state-bit”或类似的东西吗?

【问题讨论】:

  • 标准不限制最大可能的范围。它只是保证它的最小值。
  • @Zefick 这……很明显,我认为并没有回答这个问题。让我换个说法:N位有符号整数怎么可能比 {-2^(N-1); 更宽? +2^(N-1)}?
  • @Zefick 听起来您正在考虑该语言的早期版本。
  • @UKMonkey 期望什么?举个例子:我有 INT_MAX = 2 ^ 42 和 32 位 int。是否符合标准?如果是——怎么可能?
  • "符合标准吗?" C++ 20 之前是的。 “如果是——怎么可能?”可能不是;但标准不在乎。

标签: c++ standards bit theory signed


【解决方案1】:

C++2a 虽然预计会成为 C++20 标准,但目前还没有。

除此之外,虽然当前草案对有符号整数强制执行 two's-complement representation,但当前标准 (C++17) 和所有前身都限制选择
具体来说,提供的其他选项是signed magnitude representationones' complement。两者都具有负零

有关于 N 位有符号整数范围的信息。具体来说,并非所有对象表示的 N1 位都需要成为值表示的 N2 位的一部分,the exception of the narrow character types。因此,值表示的 N 位宽度可能更小。考虑到pigeonhole-principle,它不能更大也就不足为奇了。

比特是二进制的假设深深嵌入语言中,就像它遍及许多其他编程语言一样。改变这将是一个重大项目。

【讨论】:

    【解决方案2】:

    目前没有最终的 C++20 标准。您可能想到的提案是 P1236,它说:

    有符号整数类型的可表示值的范围是 -2^(N-1) 到 2^(N-1)-1(含),其中 N 称为该类型的范围指数。

    这是最大值和最小值。因为该提案需要对有符号整数进行二进制补码,所以没有变化的机会。简单地说,N 位不能用于表示超过 2^N 个不同的值(根据鸽笼原理),因此范围尽可能大,即使它仅指定为最小范围。

    至于三态位,它们不适用于该语言。

    【讨论】:

    • 所以我有权假设在 C++20 之前最大值必须是“从 -2^(N-1) 到 +2^(N-1)”吗?而在 C++20 提案中,它更改为“从 -2^(N-1) 到 +2^(N-1)-1”?
    • N(“范围指数”)在 C++20 之前并不作为一个概念存在,所以这不是一个真正可以回答的问题。但在这个宇宙中,不可能有一个 N 位整数类型可以表示 -2^(N-1) 到 +2^(N-1) 范围内的任何值。
    • 这是我认为的答案。术语“范围指数”不存在,但从 -(2^(N-1) - 1) 到 +2^(N-1) - 1 的 N 位有符号整数范围的规则确实存在,不是吗?
    • @AlexanderG。 -- 目前要求的值为 -2^(N-1)+1 到 +2^(N-1)-1。因此对于 16 位值,范围是 -32767..+32767。该范围的值比 N 位可以表示的整个范围少一个值。这允许补码、补码和符号幅度表示等(这三种是最常见的)。
    猜你喜欢
    • 2013-10-05
    • 2014-04-07
    • 2013-10-04
    • 2022-11-18
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    • 2021-08-19
    • 1970-01-01
    相关资源
    最近更新 更多