1. 关于原码、反码、补码
- 原码:一个数在计算机中的二进制形式,最高位表示符号位,1 表示 负,0 表示 正
[ 1 ]原 = 0000 0001
[ -1 ]原 = 1000 0001 - 反码:正数的反码与原码相同,负数的反码:在原码的基础上,符号位不变,其它各位取反(1 变 0,0 变 1)
[ 1 ]反 = 0000 0001
[ -1 ]反 = 1111 1110 - 补码:正数的补码与原码相同,负数的补码:反码 + 1
[ 1 ]补 = 0000 0001
[ -1 ]补 = 1111 1111
2. 计算机运算
- 计算机中只有加法,没有减法,减去一个数,就是加上这个数的负数
- 计算机运算时,符号位参与运算
- 人识别数,一定要看原码(对于人类而言,二进制表示的数一定是从原码中求出的)
- 原码运算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2 - 反码运算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [ 1000 0000 ]原 = -0 - 补码计算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = 0
反码的作用是解决减法运算,补码的作用是解决反码产生的 ±0 问题
综上,计算机内部采用补码的方式存储有符号的数据,采用补码的方式进行运算
3. 为什么byte类型的范围是 -128 ~ 127?
- byte 占一个字节(8个 bit 位),最高位是符号位,尾七位可以表示的就是 0 ~ 2^7 - 1( 1000 0000 = 2 ^ 7,减1,得到 111 1111),所以 byte 可以表示 -127 ~ 127
- [1000 0000]补 表示 -128,-128只有补码,没有原码和反码
- 我认为[1000 0000]补 = [0111 1111]反 = [0000 0000]原 = 0;已经有[0000 0000]原 表示 0 了,不需要[1000 0000]补 表示 0 了,所以[1000 0000]补 表示 -128
- 综上所述 byte 的范围就是 -128 ~ 127
- byte类型,1 + 127 = [0000 0001]原 + [0111 1111]原 = [0000 0001]补 + [0111 1111]补 = [1000 0000]补 = -128;
2 + 127 = [0000 0010]原 + [0111 1111]原 = [0000 0010]补 + [0111 1111]补 = [1000 0001]补 = [1000 0000]反 = [1111 1111]原 = -127
4. 基本类型的范围
基本数据类型 | 字节 and 范围 |
---|
byte | 1 , -128 ~ 127(- 2 ^ 7 ~ 2 ^ 7-1 ) |
short | 2,- 2 ^ 15 ~ 2 ^ 15-1 |
int | 4,-2 ^ 31 ~ 2 ^ 31-1 |
long | 8,-2 ^ 63 ~ 2 ^ 63 - 1 |
float | 4 |
double | 8 |
char | 2 |
5. 关于 int 类型的范围
- 0000 0000 0000 0000 0000 0000 0000 0000,int类型占4个字节,32个bit位
- 最高位是符号位,尾31位可以表示的是 0 ~ 2^31 - 1,所以 int 可以表示 -2 ^31 - 1 ~ 2 ^31 - 1
- [1000 0000 0000 0000 0000 0000 0000 0000]补 表示 -2^31,[0111 1111 1111 1111 1111 1111 1111 1111]反 = [0000 0000 0000 0000 0000 0000 0000 0000]原 表示 0,与 byte 类似
- 因此,int 类型的范围是 -2 ^ 31 ~ 2 ^ 31-1
神奇黄河口,魅力石油城
山东东营