【问题标题】:range of size of signed int有符号整数的大小范围
【发布时间】:2013-10-04 13:03:27
【问题描述】:

我在考虑 int 的大小(有符号和无符号)。无符号整数的大小很容易计算,但是当涉及到有符号时,我感到困惑..如果 int 是 2 个字节,第 15 个字节是符号,那么它的大小是 32767,这是可以理解的.. 但是当我尝试计算-ve 至少我做了 1 1111111111111 ..(16 个)。忽略有符号位(第 16 位),值仍然是 32767,所以我得到范围 +32767 到 -32767(这不是正确的范围)。 或者这可能不是计算范围的正确方法,因为编译器会将其视为 -1。

那么 +32767 到 -32768 是如何计算的??

【问题讨论】:

  • 它应该如何数学计算
  • 您的机器可能正在使用二进制补码表示。
  • @jxh 是的,这不是 OP 的要求。
  • 问你的问题:这些有多少个整数:-1 to 1-32767 to +32768-32767 to +32767
  • @P0W 这也不是“独占与包含区间边界”的问题。 OP 对如何表示 2 的补码有错误的假设。

标签: c range


【解决方案1】:

对于二进制补码表示,数字的取反是通过取数字的补码然后加 1 来实现的。因此,补码的数字 0xFFFF0x0000,加 1 产生 0x0001。所以在二进制补码中,-1 由所有位集合的二进制值表示。

最大的正符号16位数字是0x7FFF,它的负数表示是0x8001。查看该负数,您可以看到,通过从该值中再减去一个,我们得到一个更大数量级的负数:0x8000

所以,32767 = 0x7FFF-32768 = 0x8000

【讨论】:

  • 所以按照这个逻辑,我可以得到更多的负数……只要继续减去 1
  • 除非你用完了位,所以你会得到有符号整数溢出,这会导致未定义的行为。但是,一般来说(即从数学上讲),这就是你如何顺序形成更大数量级的负数。你减去 1。
  • 或者它可以是这样的......在积极的一面0-32767(32768个数字)所以相同数量的数字也将在负数范围内。 32767=0111 1111 1111 1111. 现在 -32767=(它将在 2 的补码中)1000 0000 0000 0001. 并且在负侧 -1 到 -32767=32767 数字,所以会有一个数字,即 -32768 和相同两边的数量。
  • 如果我正确理解了您的评论,那么您就正确理解了我的回答。
  • 您经常会在<limits.h> 中看到INT_MIN 被定义为(-INT_MAX - 1) 的二进制补码系统。
【解决方案2】:

但是当我尝试计算 -ve 最小值时,我做了 1 1111111111111..(16 个)。忽略有符号位(第 16 位),值仍然是 32767,所以我得到范围 +32767 到 -32767(这不是正确的范围)

嗯,如果您的架构以与您相同的方式定义负范围,它可能是正确的范围:也就是说,如果它使用 "sign and magnitude"(或“符号和绝对值”)表示。

这是完全正确的:在 C 中,有符号整数必须使用 2 的补码表示(正如您所假设的那样)。


但是,如果您的平台确实使用了 2 的补码,那么您计算最小负值的方法是不正确的。然后你必须从1111 1111 1111 1111(即-1)倒数,直到1000 0000 0000 0000,结果是-32768。

这是真的,因为所有 15 位都在变化(只有第 0 位,符号位保持不变),所以有2 ^ 15 可能的变化,如果你从 -1 开始,你将到达 -32768。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-07
    • 2019-11-09
    • 2011-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-18
    • 2011-04-23
    相关资源
    最近更新 更多