C语言必备知识点2 —— 理解char类型取值范围定义(Essential knowledge points 2 of C language - understanding the definition of value range of char type)
char 分为 signed char (有符号char)和 unsigned char(无符号char),它们都是占一个字节 —— 8 bit 位。
8个二进制位存放二进制序列的话,共有 2^8 =256 种可能(可以用概率的知识点理解,每一个位置有2种可能,所以一共的可能数就是 2*2*2*2*2*2*2*2 = 2^8 )
我们知道,在C语言中 signed char 的范围是 -128 ~ 127, unsigned char 的范围是 0 ~ 255,那这个范围要怎么理解呢,以下将进行详细说明。
(1)signed char 理解图:
说明:
第一列列出了 8bit 在内存中的全部可能,从 00000000 ~ 11111111,因为在内存中的存放的是补码,所以我们就认为第一列是补码;
第二列列出了对应第一列补码计算得到的反码(正数反码和补码相同,负数补码 -1得到反码);
第三列列出了由第二列反码计算得到的原码(正数原码和补码相同,负数符号位不变,其他位按位取反);
第四列列出了由第三列原码计算得到的十进制数。
从以上图就可以得到:有符号 char 的范围是 -128~127
(2)unsigned char 理解图:
说明:
第一列列出了 8bit 在内存中的全部可能,从 00000000 ~ 11111111,因为在内存中的存放的是补码,所以我们就认为第一列是补码;
第二列,第三列分别列出了第一列值对应的反码和原码,因为是无符号数,所以原反补码相同;
第四列列出了由第三列原码计算得到的十进制数。
从以上图就可以得到:无符号 char 的范围是 0~255
(3)signed char 的圆轴表示图:
说明:
这个图的作用主要是方便我们就加减计算,表示当对二进制数从 00000000 加 1 加到 11111111,实际上对应的就是从十进制 0 ~ 127 ~ -128 ~ -127 ~ -126 ~ -3 ~ -2 ~ -1 的过程。
即当对 127+1 的时候,得到的就是 -128,对应内存中就是对补码 01111111 + 1 的时候,得到的就是 10000000
这个在之后的C语言整型在内存中的存储练习题中也会讲述到。
以上知识点来自:https://www.bilibili.com/video/BV1q54y1q79w?p=29