C++ 数据类型
字符类型没啥好说的,这里引用菜鸟教程-数据类型,针对char类型理解数据在计算机中实际存储方式
char类型为什么表示范围是-128 到127之间
我们知道一个字节有八位,那么一个字节能表示2 的8次方的数据
0000 0000
0000 0001
…
…
1111 1110
1111 1111
对于有符号的char类型,每个字符的首位表示该字符的符号0表示正,1表示负。
对于127 二进制表示为0111 1111
当执行127 + 1 时得到二进制 1000 0000(十进制-0)
本应该是128 ,却得到了负0,为了避免这种歧义,规定1000 0000为-128,并且-128的补码也是1000 0000 但反码是1111 1111
除此以外,计算机中存储数据是存该数据的补码,那么:
正数的补码.反码.原码都一致
负数的补码=反码+1
负数的反码是除了首位符号位不变的基础下,其余所有位数取反
源码 | 补码 | 数据 |
---|---|---|
0000 0000 | 0000 0000 | 0 |
0000 0001 | 0000 0001 | 1 |
… | … | … |
0111 1111 | 0111 1111 | 127 |
1000 0000 | 1000 0000 | -128 |
1000 0001 | 1111 1111 | -1 |
… | … | … |
1111 1110 | 1000 0010 | -126 |
1111 1111 | 1000 0001 | -127 |
根据上述表格,会发现这种表示方法可以吧减法用加法来表示
比如要计算127-126
计算机中所有加法都是有补码进行的,只需要用127和负126的补码进行逻辑加法。
0111 1111
+
1000 0010
——————
0000 0001 ---->正好是1
计算两个负数相加 -1-2
1111 1111
+
1111 1110
——————
1111 1101(高位舍弃,得到-3的补码)
将-3的补码 转化成原码
首先 补码=反码+1—>那么 反码=补码-1—>反码=补码+(-1)—>反码=补码+1111 1111
前面我们说到计算机减法也是通过加 负数的补码来实现的
-3的反码:
1111 1101
+
1111 1111
——————
1111 1100 —>得到反码
反码转换成原码
1000 0011 = -3
由此得到-1-2=-3
注意
计算机加法运算时不会计算符号位.