二进制补码:(使用二进制补码的目的:降低成本)
1)将最高位为1的大数作为负数使用,最高位也叫做符号位。
2)计算时如果结果超出范围,新多出的数字自动溢出(舍弃)。
3)在不超过范围的情况下,补码运算符合数学规则。
4)缺点:有范围,不能进行超范围计算
补码的取反对称现象:-n = ~n+1
~n = -n-1
“~”表示取反,对二进制取反(取反就是0变1,1变0)
例如:
-5的补码 就是5的二进制数取反 + 1
5(10) = 00000000 00000000 00000000 00000101(2)
~5(取反) = 11111111 11111111 11111111 11111010
-5的补码 = 11111111 11111111 11111111 11111011
符号位扩展现象:
低位数补码(如4位)扩展为高位数补码(32位)
正数在前面补0,负数在前面补1
32位补码的一些事儿:
最小值 0x800……000
………………
-2 0xfff……ffe
-1 0xfff……fff
0 0x000……000
1 0x000……001
2 0x000……002
………………
最大值 0x7ff……fff
进制的总结:
1)计算机只能处理2进制数据(经常是补码)
2)计算机内部没有10进制和16进制
3)10进制是人类处理数据的习惯,
Java中通过API提供方法实现10进制的处理
4)16进制是便捷的2进制书写格式
5)一切交给计算机处理的数据都要转换为2进制数据
6)0x(零x)是16进制的书写格式 0(零)开头是8进制书写格式
扩展知识:
8位补码为一个字节
10进制计数规律
数字: 0 1 2 3 4 5 6 7 8 9
基数:10
权: ..... 1000 100 10 1
权是基数的n次幂
2进制计数规律
数字: 0 1
基数:2
权: ..... 128 64 32 16 8 4 2 1
权是基数的n次幂
(10) (2)
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
展开式:
11001010(2) = 128+64+8+2 = 202(10)
234(10) = ?(2)
128 64 32 16 8 4 2 1
234(10) = 1 1 1 0 1 0 1 0 (2)
222(10) = ?(2)
195(10) = ?(2)
238(10) = ?(2)
符号位扩展现象:
低位数补码(如4位补码)扩展为高位数补码(如32位补码):
正数(在前面)补0 负数(在前面)补1
(10) 4位补 8位补 32位补码
min -------- 10000000 00000000 00000000 00000000
...
-129 -------- 11111111 11111111 11111111 01111111
-128 ---- 10000000 11111111 11111111 11111111 10000000
-127 ---- 10000001
-126 ---- 10000010
....
-10 ---- 11110110
-9 ---- 11110111
-8 1000 11111000
-7 1001 11111001
-6 1010 11111010
-5 1011 11111011
-4 1100 11111100
-3 1101 11111101 11111111 11111111 11111111 11111101
-2 1110 11111110 11111111 11111111 11111111 11111110
-1 1111 11111111 11111111 11111111 11111111 11111111
0 0000 00000000 00000000 00000000 00000000 00000000
1 0001 00000001 00000000 00000000 00000000 00000001
2 0010 00000010 00000000 00000000 00000000 00000010
3 0011 00000011 00000000 00000000 00000000 00000011
4 0100 00000100
5 0101 00000101
6 0110 00000110
7 0111 00000111
8 ---- 00001000
9 ---- 00001001
10 ---- 00001010
...
126 ---- 01111110
127 ---- 01111111 00000000 00000000 00000000 01111111
128 ---- -------- 00000000 00000000 00000000 10000000
129 ---- -------- 00000000 00000000 00000000 10000001
....
max ---- -------- 01111111 11111111 11111111 11111111
7 f f f f f f f
最大值 0x7ff……fff
最小值 0x800……000
-1 0xfff……fff
-2 0xfff……ffe
补码运算:
-3 1101
-3 1101
+ 11 1
-------------
-6 1010
-5 的补码:
-5 = ~5 + 1
0101 (5)
1010 (~5)
1011 (~5+1=-5)
16 进制计数规律
数字: 0 1 2 3 4 5 6 7 8 9 a b c d e f
基数:16
权: 256 16 1
权是基数的n次幂
16进制用于简化2进制的书写!
每4位2进制数据 可以简写为1位16进制数
16进制就是2进制!
10 16 2
0 00 0000 0000
1 01 0000 0001
2 02 0000 0010
3 03 0000 0011
4 04 0000 0100
5 05 0000 0101
6 06 0000 0110
7 07 0000 0111
8 08 0000 1000
9 09 0000 1001
10 0a 0000 1010
11 0b 0000 1011
12 0c 0000 1100
13 0d 0000 1101
14 0e 0000 1110
15 0f 0000 1111
16 10 0001 0000
17 11 0001 0001
18 12 0001 0010
...
65 41 0100 0001
66 42 0100 0010
...
192 c0 1100 0000
193 c1 1100 0001
...
255 ff 1111 1111
进制的总结:
1) 计算机只能处理 2 进制数据(经常是补码)!
2) 计算机内部没有 10 进制 和 16进制
3) 10进制是人类 处理数据的习惯,
Java 利用API 提供算法(方法)实现 10进制的处理!
4) 16 进制 是便捷的 2进制书写格式!
5) 一切交给计算机的处理的数据,都要转换为2进制!