加减运算可以分为原码和补码两种方式。
(默认8位二进制运算)
被加数和加数有四种可能出现的结果:
正+正、正+负、负+正、负+负
被减数和减数有四种可能出现的结果:
正-正、正-负、负-正、负-负
都使用绝对值进行相加、但结果不同。
正数相加为正数、负数相加为负数。需要改变符号位的正负表示。
结果可能会溢出
使用绝对值大的数减去绝对值小的数。符号和绝对值大的数相同。
正数减负数:将负数取绝对值,然后相加
负数减正数:将正数取相反数,然后相加
负减负:将减数取绝对值进行相加操作
正减正:将减数取相反数进行相加操作
设机器字长为8位(含一号符号位),A=15,B=-24,求[A+B]补和[A-B]补
原码 补码
A=+1111 -> 00001111 -> 00001111
B=-11000 -> 10011000 -> 11101000
-B = +11000 -> 00011000 -> 00011000
[A+B]补 = [A]补 + [B]补 = 00001111 + 11101000 = 11110111
该补码的原码为 10001001 :-9
负数补码转化原码:
1、数值位取反加一
2、最右边的一及其右边不变,左边的数值位取反。
[A-B]补 = [A]补 + [-B]补 = 00001111 + 00011000 = 00100111
该补码的原码为 :00100111=39
符号位变化即发生溢出
若C为124.求 [A+C]补和[B-C]补
[A+C]补: 00001111 + 01111100 = 10001011 真值为-117溢出(应为139
[B-C]补: 11101000 + 10000100 = 01101100 真值为+108溢出(应为-148
8位补码表示:-128~127
若两个正数相加超过127变为负数或两个负数相加低于-128变为正数就会发生上溢和下溢。
使用A表示被加数的正负、B表示加数的正负、S表示结果的正负。溢出逻辑表达式为:
V = AB[S]逆 + [A]逆[B]逆S
若V=0,表示无溢出。
若V=1,表示有溢出。
逻辑与,都为1才为1
逻辑或,都为0才为0
逻辑非,相反
根据进位情况判断是否发生溢出。
若符号位为0,数值位往符号位进1,发生上溢。
若符号位为1,数值位往符号位进0,发生下溢。
异或结果为1表示有溢出,为0表示没有溢出。
双符号位表示数据(实际只存储一种符号位,运算时会复制一个符号位)
正数符号位为00,负数符号位为11。
若为01发生上溢,若为10发生下溢。
双符号位:模4补码
单符号位:模2补码
将数据从int转为long:
0,1011010
只需要在前面补0
0,000000001011010
原码反码补码都一样
原:1,1011010 在1后面补8个0 , 1,000000001011010
反:1,0100101 在1后面补8个1 , 1,111111110110101
补:1,0100110 在1后面补8个1,1,111111110110110
原码反码补码都一样
尾部补0
0.1011010 -> 0.101101000000000
原:1.1011010 在后面补8个0 , 1.101101000000000
反:1.0100101 在后面补8个1 , 1,011010111111111
补:1.0100110 在后面补8个0,1.011011000000000