char 分为 有符号的(signed) 和无符号的(unsigned)
取值范围分别为:
signed char -128~127
unsigned char 0~255
char为字符型,但在内存中存储的却是ASCII码值,所以char实际上属于整型的一种
以 char a = 1 或 char a = -1为例
正数的原码,反码,补码相同
char a = -1 时
最高位为符号位
原码 -- 反码 符号位不变,其他位按位取反
反码 -- 补码 反码+1
上图是整形 1 的 原码,反码,补码
但char类型在内存中只占一个字节(8个bit位),而int类型在内存中占4个字节(32个bit位),所以把int型放在char型中会发生截取
所以实际char a = 1的原码,反码,补码为
char a = -1 时
内存中存储的是补码,计算机在运算时也是以补码运算
补码 --> 原码 取以上的方法或者取以上相反的方法(补码 -1得到反码,反码符号位不变,其他位按位取反)
接下来我们以题为例来深层次理解
运行结果
为什么会这样呢?
下面以图来解释
ps:补码
右边为正,左边为负
图中1000 0000 正是 -128
+1 为 0111 1111 十进制为 127
+2 为 0111 1110 十进制为 126
图中很好地证实了 char 类型运算超过了存储范围会怎么样
当char类型与int类型的只发生运算关系时会发生整形提升
此时a会从一个字节 提升为 四个字节 也就是从8个bit为提升为32个bit位
注意的是 有符号的(signed)按符号位提升,无符号的(unsigned)按0提升