【问题标题】:Signed int range confusion有符号整数范围混淆
【发布时间】:2016-03-01 14:24:27
【问题描述】:

这个问题可能是非常基础的,但我只是在谷歌搜索了几天之后才在这里发布,并且我对 C 中的有符号整数有适当的基本了解。

其实有人说signed int有范围

  1. -32767 到 32767 和其他人说它有范围
  2. -32768 至 32767

让我们有 int a=5(有符号/让我们只考虑 1 个字节)

*a=5 的第一个表示表示为正数的 00000101,a=-5 表示为 10000101(因此范围 -32767 到 32767 是合理的) (这里的 msb/符号位是 1/0,数字将是正/负,其余(幅度位)不变)

*a=5的第二个表示为00000101为正数,a=-5表示为11111011 (msb 被认为是 -128,其余位被操作以获得 -5)(因此范围 -32768 到 32767 是合理的)

所以我混淆了这两件事。我的疑问是 c ,1) 或 2) 中带符号 int 的实际范围是多少

【问题讨论】:

  • 您已经回答了您的问题。你在问什么?也许您想搜索“有符号整数的表示”。另请注意,这两个假设实际上都不是全部事实。
  • C 中的 int 没有固定的指定大小。只定义了最小值。在 2 的补码中,n 位类型的范围从 -2^(n-1)2^(n-1)-1
  • 取决于底层平台,是使用one's complement还是two's complement(常用的补码)。至于位大小,也要看,现在int通常是32位。
  • signed int的实际范围是[INT_MIN ...INT_MAX]。范围是至少 [-32767 ... 32767]。而已。如果您担心位表示,请使用unsigned

标签: c int signed


【解决方案1】:

这取决于您的环境,通常int 可以存储 -2147483648 到 2147483647 如果它是 32 位长并且使用二进制补码,但 C 规范说 int 可以存储至少 -32767 到 32767。

引用N1256 5.2.4.2.1 整数类型的大小

它们的实现定义值的大小(绝对值)应等于或大于所示值,符号相同。

— int 类型对象的最小值
INT_MIN -32767 // -(2 15 - 1)
— int 类型对象的最大值
INT_MAX +32767 // 2 15 - 1`

【讨论】:

    【解决方案2】:

    今天,签名整数通常在two's complement notation 中完成。

    最高位是“符号位”,为所有负数设置。

    这意味着您有七个位来表示不同的值。

    在最高位未设置的情况下,您可以(总共 16 位)表示值 0..32767。

    使用最高位设置,并且因为你已经有了零的表示,你可以表示值-1..-32768。

    然而,这是实现定义的,其他表示也确实存在。您的平台/编译器的有符号整数的实际范围限制是在您环境的<limits.h> 中找到的。这是唯一明确的权威。

    在当今的桌面系统上,int 通常是 32 位或 64 位宽,相应的范围比您所说的 16 位 32767 / 32768 大得多。所以要么这些人在谈论非常老平台、非常老知识、嵌入式系统,或者最小保证范围 -- 标准规定INT_MIN 必须至少 -32767,INT_MAX 至少 +32767,即最小公分母。

    【讨论】:

    • 如果有符号位通常以 2 的补码形式完成,那么显然 -32768 到 32767 必须是范围对吗?那么至少 -32767 到至少 32767 是什么意思
    • 2015 年有数以百万计的处理器使用 8 位和 16 位寄存器,用于对这些嵌入式处理器进行编程的编译器使用 16 位 int。 C在那里很受欢迎。几乎没有真正的旧平台
    • @adi:标准不保证二进制补码表示法(正如我所写,存在其他表示法)。该标准也没有指定 int 类型的 16 位宽度(显然)。所以所有标准的保证正是我写的:INT_MIN必须是至少-32767,INT_MAX至少 + 32767。我不知道有哪个系统可以将这两个常量完全定义为这些值,它们只是两者的保证最小值
    • @chux:我一直在这样的枚举中忘记 either “old” “small”。修改了答案,因为您当然是正确的。我记得一篇题为“地球上的所有生命都是昆虫”的文章指出,在单元数量上,8 位和 16 位处理器的数量比“真正的”桌面 CPU 多几个数量级。 ;-)
    【解决方案3】:

    我的疑问是 c 中带符号的 int 的实际范围是多少,1) [-32767 to 32767] 或 2) [-32768 to 32767]

    C 的全部意义以及它对新旧平台的高度可移植性的优势在于代码不应该关心

    C 用两个宏定义int 的范围:INT_MININT_MAX。 C 规范指定:
    INT_MIN 为 -32,767 或更少
    INT_MAX 为 +32,767 或更多

    如果代码需要 16 位 2 的补码类型,请使用 int16_t。如果代码需要 32 位或更宽的类型,请使用 longint32least_t 等。不要假设 int 是未定义的代码。

    【讨论】:

    • 感谢您的响应。所以当代码需要 2 的补码和符号/幅度表示时?
    • @adi 1) 当代码需要 2 的补码时,使用精确的宽度类型,如 uint8_tint64_t 等。 2) 如果代码需要 符号/幅度表示, - 不能帮你。 3) 但最重要的是,避免在需要特定底层表示的地方进行编码。 4) 处理单个位等时,请使用无符号类型。
    • 数据类型范围是编译器依赖还是计算机体系结构依赖?
    • @adi 编译器具有最终控制权,因为它可以创建代码,可能效率低下,导致底层硬件无关紧要。但这是理论上的。真正的编译器试图与底层硬件协调工作,因此硬件驱动架构。此外,C 规范也推动了事情的发展。
    • @DevSolar C11dr §7.20.1.1 3 详细说明了有关精确宽度整数类型的选项程度。在不支持 OP 代码所需的确切宽度类型的平台上,这个问题没有实际意义。为了避免这种限制,我的comment 鼓励:“避免在需要特定底层表示的地方编码”。
    【解决方案4】:

    32767 是您可以在有符号的 16 位整数上表示的最大正值。 C对应的类型是short

    int 类型的表示字节数至少与short 相同,最多与long 相同。 int 在 16 位处理器上的大小为 2 个字节(与 short 相同)。在 32 位及更高的架构上,int 的大小为 4 个字节(与long 相同)。

    无论架构如何,int 的最小值为INT_MINint 的最大值为INT_MAX

    类似地,有常量可以获取shortSHRT_MINSHRT_MAX)、longchar 等的最小值和最大值。您无需使用硬编码常量或猜测您系统上int 的最小值是多少。


    表示#1 被命名为"sign and magnitude representation"。它是一种理论模型,使用最高有效字节存储符号,其余字节存储数字的绝对值。它被一些早期的计算机使用,可能是因为它似乎是数学中数字表示的自然映射。但是,对于二进制计算机来说,这并不自然。

    表示#2 被命名为two's complement。二进制补码系统的优点是加法、减法和乘法的基本算术运算与无符号二进制数的基本算术运算相同(只要输入以相同的位数表示,并且超出这些位数的任何溢出都将被丢弃从结果)。这就是为什么它是当今首选的编码。

    【讨论】:

      【解决方案5】:

      C 标准规定了整数值的最低限制。正如标准中所写(5.2.4.2.1 整数类型的大小)

      1. ...它们的实现定义的值应等于或大于 幅度(绝对值)与所示值相同,符号相同。

      对于int 类型的对象,这些最低限制是

      — int 类型对象的最小值

      INT_MIN -32767 // −(215 − 1)
      

      — int 类型对象的最大值

      INT_MAX +32767 // 215 − 1
      

      对于整数的二进制补码表示,正值的数量比负值的数量少一。因此,如果只使用两个字节来表示 int 类型的对象,那么 INT_MIN 将等于 -32768

      考虑到 32768 的幅度大于标准中使用的值。所以它满足标准要求。

      在表示“符号和大小”的另一个方面,限制(当使用 2 个字节时)将与标准中显示的相同,即 -32767:32767

      因此,实现中使用的实际限制取决于整数的宽度及其表示。

      【讨论】:

        猜你喜欢
        • 2020-02-16
        • 2016-08-12
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 2020-06-13
        • 2020-05-21
        相关资源
        最近更新 更多