C语言 变量可能保存的值



是什么意思?类型的大小决定了一个变量可以容纳多少不同的值

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

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

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个不同的值。

相同的位模式可以用不同的方式解释。有几种不同的表示有符号整数值的方法- 2的补码,1的补码和符号大小是你最可能听到的三种方法,而2的补码是目前为止最常见的。下面是一个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和2的补码表示符号值)。它是相同的数字值(256),只是在不同的范围内。

类似地,32位float可以表示与32位int(4294967296)相同的数字值,但它们的解释不同。位模式439d145a16既可以表示浮点值3.14159,也可以表示整型值1134367834(假设IEEE-754单精度浮点)。
  1. C允许填充位的存在,这些填充位对unsigned char以外的类型的值表示没有贡献,但您不太可能在现代硬件上看到这样的东西。

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

最新更新