【问题标题】:confusion regarding range of char关于 char 范围的混淆
【发布时间】:2014-03-23 23:52:11
【问题描述】:

我们知道char的范围是-128127

-128的2的补码和128的二进制是一样的,就是

10000000

那么为什么char的范围是-128127而不是-127128
int128-128 的情况下,两者都是不同的。

【问题讨论】:

  • char 的范围并不总是 -128 到 127。即使你不考虑 C 标准中说它有 8 个或更多位的部分,它也可以是签名或未签名。也许你的意思是int8_t

标签: c binary char range twos-complement


【解决方案1】:

在二进制补码表示法中,只要高位为 1,则该数字为负数。所以最大的正数是

01111111 = 127

最小的负数是

10000000 = -128

int 也会发生同样的情况,但它的范围要大得多。最大的正整数是

01111111 11111111 11111111 11111111 = 2147483647

最小的负整数是

10000000 00000000 00000000 00000000 = -2147483648

如您所见,在这两种情况下,最小的负数都比最大的正数多 1。

您可能想知道,如果除了符号位之外的位数相同,为什么负数比正数多?那是因为您没有计算0。它的高位为 0,因此在此表示法中被认为是正数。当你包括在内时,有 128 个负字符和 128 个非负字符,它们是相等的。

【讨论】:

  • 4294967234为例,它的二进制是11111111111111111111111111000010,它的高位是1,那么它怎么是正数呢?
  • 这是一个无符号整数,我们说的是有符号整数。
  • 或者它是一个long long,它是64位。
  • 它是无符号的,所以高位理论不适用于无符号整数
  • @zee 是的,unsigned int 顾名思义,这个变量中不能有负数。所以你有所有的 32 位(如果它是一个 32 位变量)来表示一个正数。如果你需要表示负数,计算机需要知道它是否为负数,这是通过将符号位设置为 1 并使用 2 的补码来完成的。
【解决方案2】:

一个字符有 8 位。因此,当您有 8 位要处理时,-128 和 128 的位模式是相同的。 (忽略符号位)

现在是 int。它有更多位,因此 MSB 不是 -128,而是更大的 -ve 数,具体取决于平台。

在“更高”的数字上确实会出现同样的问题

【讨论】:

    【解决方案3】:

    看 128 是

    10000000
    

    但默认情况下 char 是有符号的,编译器将第一位视为符号位并处理否。 为负并计算其 2s 补码(因为 MSB 为 1)

    2s complement is
     01111111
          +        1
     10000000
    

    所以 - 128 被存储 要存储 +128 编译器必须考虑要解释的 9 位

    010000000
    

    这里 MSB 为 0 表示正数。但是大小是 9 位,这说明了为什么 char 最多只能容纳 +127,如果我们要存储 +128,那么 -128 将按照上面的说明进行存储

    【讨论】:

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