【问题标题】:Possible values held by a variable变量持有的可能值
【发布时间】:2023-03-17 07:20:01
【问题描述】:

什么是类型的大小将决定一个变量可以容纳多少不同的可能值

例如在我的书中,它说一个 char 变量可以保存从 -128 到 127 的值范围

我只是想理解粗体字的含义。

【问题讨论】:

  • 它暗示了你所引用的内容。如果您比较 16 位(2 字节)宽的变量所涵盖的范围,它会变得更清楚。 256 * 256,一些 64k,或 -32k 到 + 32k-1
  • 类型的大小决定了它包含多少位。如果 char 是 8 位(并非总是如此),它可以容纳 2^8 = 256 个不同的值。这些代表0..255还是-128..127取决于类型是unsigned还是signed
  • 变量的大小是它占用的内存位数,它限制了可以存储的数字范围。例如,在 1 位变量中可以存储 2 个值,在一个字节中可以存储 2^8 = 256 个数字(0..255 或 -128..+127)。
  • 书错了。类型的大小,即其中的位数,将决定该类型变量可以容纳多少值的上限。 n 位有 2^n 种不同的设置,因此具有 n 位的类型可以表示最多 2^n 个值。但是,一个类型表示的值是由该类型的语义决定的。某些位组合可能表示与其他组合相同的值(例如,1.234•10^3 和 12.34•10^2 的十进制浮点位)或可能根本不表示有效值(例如,32 位指针类型,当地址空间只有 24 位)。

标签: c pointers


【解决方案1】:

N 位可以表示 2N 个不同的值:

1 bit,  2 values - 0, 1
2 bits, 4 values - 00, 01, 10, 11
3 bits, 8 values - 000, 001, 010, 011, 100, 101, 110, 111

等等

8 位宽的类型可以表示 28 或 256 个不同的值。 16 位宽的类型1 可以表示 216 或 65536 个不同的值。

相同的位模式可以用不同的方式解释。有几种不同的方式来表示有符号整数值 - 二进制补码、二进制补码和符号幅度是您最有可能听到的三种方式,而二进制补码是迄今为止最常见的。下面是一个 4 位示例,展示了每个方案中位的解释方式:

Bits    Unsigned    Two's Cmp    Ones' Cmp    Sign-mag
----    --------    ---------    ---------    --------
0000           0            0            0           0     
0001           1            1            1           1
0010           2            2            2           2
0011           3            3            3           3
0100           4            4            4           4
0101           5            5            5           5
0110           6            6            6           6
0111           7            7            7           7
1000           8           -8           -7          -0
1001           9           -7           -6          -1
1010          10           -6           -5          -2
1011          11           -5           -4          -3
1100          12           -4           -3          -4
1101          13           -3           -2          -5
1110          14           -2           -1          -6
1111          15           -1           -0          -7

4 位可以表示 16 个不同的值,但这些值取决于位的解释方式。

因此,unsigned char 表示[0..255] 范围内的值(假设CHAR_BIT == 8),其中signed char 表示[-128..127] 范围内的值(假设CHAR_BIT == 8 和二进制补码表示有符号值)。这是相同的 number 个值 (256),只是在不同的范围内。

同样,32 位 float 可以表示与 32 位 int (4294967296) 相同的数量 个值,但它们的解释不同。位模式439d145a<sub>16</sub> 可以表示浮点值3.14159整数值1134367834(假设 IEEE-754 单精度浮点)。


  1. C 允许存在对unsigned char 以外的类型的值表示没有贡献的填充位,但您不太可能看到类似的内容在现代硬件上。

【讨论】:

    【解决方案2】:

    变量存储在由字节组成的内存中。每种变量类型在表示这些字节的方式和它保留的字节数方面都不同。 对于您的示例,一个 char 包含在一个 1 字节的内存块中,并且该字节包含 8 位。当您用无符号数表示这些位时,您可以获得的最小数字为 0 (0b00000000),最大数字为 255 (0b11111111)。回到 char 示例,char 以带符号的方式表示,搜索 2's complement 以获取更多详细信息,此表示可以通过更改从先前方法转换字节的方式来保存您提到的值。例如数字(0b00000000)仍然是0,但数字(0b11111111)是-1。

    【讨论】:

      猜你喜欢
      • 2014-07-03
      • 1970-01-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 1970-01-01
      • 2016-10-30
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多