二进制的原码、反码、补码和程序超出整型限制时的运算

二进制的原码、反码、补码和程序超出整型限制时的运算

1.二进制的原码、反码和补码运算 

    原码表示法:原码表示法是机器数的一种简单表示法。其符号位用0表示正数,用1表示负数,数值一般用二进制形式表示。原码在进行加减法运算时,符号位不能直接参与运算,而是要分别计算符号位和数值位。当数字为正数时,直接进行二进制运算;当数字为负数时,要转换成补码进行运算。得到的结果为正数,则为最后结果,如果为负数,则符号位不变,进行减1,取反操作,得到最后结果。

(1)正数:二进制原码、反码和补码都相同,为原码形式。

(2)负数:原码为它的二进制数,反码为原码的符号位不变,其余各位取反,补码为其反码在最低位加1。

例1:当机器字长为8位二进制数时,进行加法运算5+3。

    因两数都为正数,直接采用原码形式进行运算

    5的原码:0000 0101

    3的原码:0000 0011

    5+3:0000 0101+0000 0011=0000 1000=8

例2:当机器字长为8位二进制数时,进行减法运算-5-3。

    因存在负数参与运算,所以要取负数的补码进行运算

    -5的原码:1000 0101,反码:1111 1010,补码:1111 1011

    -3的原码:1000 0011,反码:1111 1100,补码:1111 1101

    -5-3=(-5)+(-3):1111 1011+1111 1101=1111 1000,其中所得结果为负数,要保持符号位不变,进行减1取反操作,得到

最后结果,为1000 1000,即-8。

2.程序超过整型限制时的运算

    整型大致分为有符号和无符号两种,无符号整型的优点是可以增大变量能够存储的最大值。

例:

#include <iostream>
#include <climits>
int main()
{
	using namespace std;
	short int signed_flag = SHRT_MAX;
	unsigned short int unsigned_flag = SHRT_MAX;
 
	signed_flag = signed_flag + 1;
	unsigned_flag = unsigned_flag + 1;
 
	cout << "signed_flag = " << signed_flag << endl;
	cout << "unsigned_flag = " << unsigned_flag << endl;
 
	signed_flag = 0;
	unsigned_flag = 0;
 
	signed_flag = signed_flag - 1;
	unsigned_flag = unsigned_flag - 1;
 
	cout << "signed_flag = " << signed_flag << endl;
	cout << "unsigned_flag = " << unsigned_flag << endl;
}
运行结果:

注:在此系统上,short int 最大值为32767。对于有符号 short int 来说,当为最大值时,加1超过了限制,其值将变为范围的另一端;对于无符号 short int 来说,当为0时,减1超过了限制,其值也将变为范围的另一端。

猜你喜欢

转载自blog.csdn.net/qq_31741481/article/details/84704958