【问题标题】:relation between size of types and their range of values? [closed]类型大小与其值范围之间的关系? [关闭]
【发布时间】:2018-01-21 10:38:06
【问题描述】:

在 c++ 或任何其他语言中,类型的大小与它们取值的范围之间有什么关系? 例如- char 有 1 个字节大小,这意味着没有。它可以存储的值是 2^8。那么为什么它只能取 -128 到 127 的值,为什么不能取更大的值。 它与位模式有关吗? 还是我误解了这件事。我是编程新手,我很快掌握了这些概念,但我被困在了这个概念中!! 请也解释一下与浮点类型有关的问题!!提前致谢

【问题讨论】:

  • -128 到 127 2^8 个值!
  • 2^8 是 256,因此单个字节可以存储 0 到 255 或 -128 到 127 的值(如果您认为它们已签名)。两个范围都包含 256 个不同的值。如果您需要更大的值,您可以使用更多字节。
  • 任何其他语言? Python 几乎没有绑定整数类型,这能回答你的问题吗?

标签: c++ types floating-point byte


【解决方案1】:

从状态数的基本概念开始。位有两种状态 - 01。两位有四种可能的状态:00011011。对于 3 位,状态数为 8:

000 001 010 011 100 101 110 111

现在应该出现这种模式:添加一个额外的位会使一组位可以采用的状态数加倍。这很容易看出:如果k 位的状态数是N,那么对于k+1 位,当添加的位为0N 时,有更多状态是1,或者完全是N+N。因此,k 位可以有 2k 个状态。

字节是 8 位的组,所以一个字节可以有的状态数是 2k,也就是 256。如果你用一个字节来表示一个无符号值,它的范围是 0 ..255,包括在内。对于有符号值,取一位来表示符号。在two's complement representation 中,值范围变为-128..127。负值允许一个额外的值,因为范围的非负部分包括零,而范围的负部分不包含零。

【讨论】:

    【解决方案2】:

    其简单的数据类型变量具有2^(sizeof(datatype) * CHAR_BIT) 值。现在取决于这个数据类型是signed 还是unsigned

    signed 具有 0 .. ((2^(sizeof(datatype) * CHAR_BIT))-1) 值。

    unsigned 具有 -((2^(sizeof(datatype) * CHAR_BIT))/2) .. +((2^(sizeof(datatype) * CHAR_BIT)/2)-1) 值。


    char 数据类型

    2^8256

    在哪里

    -128..127 具有 256

    对于signed charunsigned char 有范围

    0..255,仍然是 256 值。


    字节是 8 位序列。

    +---+---+---+---+---+---+---+---+
    | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
    +---+---+---+---+---+---+---+---+
     2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
    

    最高位(小字节序)表示值是0 - positive还是1 - negative,其余位为值。

    那么你有

    +---+---+---+---+---+---+---+---+
    | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |    < Max positive number
    +---+---+---+---+---+---+---+---+
     2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
    

    +---+---+---+---+---+---+---+---+
    | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |    < Max negative number
    +---+---+---+---+---+---+---+---+
     2^7 2^6 2^5 2^4 2^3 2^2 2^1 2^0
    

    零是因为数字通常用two's complement 表示。

    以下是二进制补码的转换

    1. Invert all bits -> |0|1|1|1|1|1|1|1| ->  127
    2. Add 1           -> |1|0|0|0|0|0|0|0| ->  128
    3. Change sign     ->                   -> -128
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多