1. 原码
--- 原码就是符号位加上二进制值, 即用第一位表示符号, 其余位表示值.
比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是: [1111 1111 , 0111 1111], 即 [-127 , 127]
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算.
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数, 补码表示方式也是人脑无法直观看出其数值的. 通常也需要转换成原码在计算其数值.这样的目的是:
1. 巧妙地把符号位参与运算,
2. 并且将减法变成了加法,
以下是一些示例:
输出三码源代码:
1 num = int(input('Please input the num to transform\n')) 2 def output_byte(num): 3 if num >= 0: 4 num_bin = bin(num) 5 num_bin_split = num_bin.split('b')[1] 6 num_bin_split_8 = num_bin_split.zfill(8) 7 print("{}的三码是:{}".format(num, num_bin_split_8)) 8 else: 9 # 获取二进制码,去掉前缀,8位制##################### 10 num_bin = bin(num) 11 num_bin_split = num_bin.split('b')[1] 12 num_bin_split_8 = num_bin_split.zfill(8) 13 num_bin_split_8 = '1'+ num_bin_split_8[1:] 14 15 print("{}的二进制码是:{}".format(num,num_bin_split_8)) 16 17 # 获取反码,字符串逐个取反######################### 18 num_list = list(map(int, num_bin_split_8)) 19 num_list[0] = 1 20 for i in range(1, len(num_list)): 21 # print(num_list[i], end = '----') 22 # num_list[i] = ~num_list[i] 23 if num_list[i] == 0: 24 num_list[i] = 1 25 else: 26 num_list[i] = 0 27 # print(num_list[i]) 28 29 num_back = (''.join('%s' %m for m in num_list)) 30 print("{}的反码是: {}".format(num, num_back)) 31 32 ###### 获取补码################################### 33 # 二进制加法不会表达,转化为十进制进行 34 num_int = int(num_back, 2) 35 num_int += 1 36 37 num_bin_split = bin(num_int).split('b')[1] 38 num_bin_split_8 = num_bin_split.zfill(8) 39 print("{}的补码是: {}".format(num, num_bin_split_8)) 40 41 output_byte(num)
作业:
1. -27的二进制原码、反码和补码,手工计算、程序验证
2. 手工计算和程序验证位运算符&、|、^
3. 7和-3,7和3,-7和3,-7和-3
4. 模仿计算机-7+3的过程
5. 证明and与or短路现象存在
作业解答:
1. -27的二进制原码、反码和补码,手工计算、程序验证
a. 原码 10011011
b. 反码 11100100
c. 补码 11100101
程序验证:
2. 计算与、或、异或
1) 加法
· 手工计算
3的三码为: 00000011 →→→ 3
-7的原码为: 10000111 →→→ -7
-7的补码为: 11111001
→→→ 加法: 11111100
相应原码为: 10000100 →→→ -4
2) 按位与&
· 手工计算
3的三码为: 00000011 →→→ 3