二进制的原码、反码、补码和程序超出整型限制时的运算
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超过了限制,其值也将变为范围的另一端。