有符号整数(二)
三、有符号整数的算术运算1、加法运算
有符号整数以补码形式存储,可以直接使用补码进行加法运算。
例1:正整数105+78
1) 两个整数的二进制形式
10510 = 0000 0000 0000 0000 0000 0000 0110 10012
7810 = 0000 0000 0000 0000 0000 0000 0100 11102
2) 对应的补码形式
105补码 = 0000 0000 0000 0000 0000 0000 0110 10012
78补码 = 0000 0000 0000 0000 0000 0000 0100 11102
3) 相加
0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | |
+ | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 |
所以和的原码为0000 0000 0000 0000 0000 0000 1011 0111,即183。
例2:负整数(-105)+(-78)
1) 两个整数的二进制形式
-10510 = 1000 0000 0000 0000 0000 0000 0110 10012
-7810 = 1000 0000 0000 0000 0000 0000 0100 11102
2) 对应的补码形式
-105补码 = 1111 1111 1111 1111 1111 1111 1001 01112
-78补码 = 1111 1111 1111 1111 1111 1111 1011 00102
3) 相加
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | |
+ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 | 1 |
所以和的原码为1000 0000 0000 0000 0000 0000 1011 0111,即-183。
2、减法运算
减法运算可以理解为是负整数的加法运算。
例如:X-Y=X+(-Y)
例1:正整数105-78
105-78=105+(-78)
1) 两个整数的二进制形式
10510 = 0000 0000 0000 0000 0000 0000 0110 10012
-7810 = 1000 0000 0000 0000 0000 0000 0100 11102
2) 对应的补码形式
105补码 = 0000 0000 0000 0000 0000 0000 0110 10012
-78补码 = 1111 1111 1111 1111 1111 1111 1011 00102
3) 相加
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 1 | |
+ | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 |
所以差的原码为0000 0000 0000 0000 0000 0000 0001 1011,即27。
例2:负整数(-105)-(-78)
(-105)-(-78)=(-105)+78
1) 两个整数的二进制形式
-10510 = 1000 0000 0000 0000 0000 0000 0110 10012
7810 = 0000 0000 0000 0000 0000 0000 0100 11102
2) 对应的补码形式
-105补码 = 1111 1111 1111 1111 1111 1111 1001 01112
78补码 = 0000 0000 0000 0000 0000 0000 0100 11102
3) 相加
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | |
+ | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 0 |
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 0 | 1 | 0 | 1 |
所以差的原码为1000 0000 0000 0000 0000 0000 0001 1011,即-27。
位数一定的情况下,有符号整数能表示的数值范围是有限的。当运算结果超出这个数值范围,就会发生溢出。
对于有符号整数,如果两个正整数相加得到一个负值或者两个负整数相加得到一个正值,就意味着发生了溢出;如果一个正整数和一个负整数相加,永远不可能发生溢出。