题目:有两个变量a,b,不用if 、?:、switch 等判断语句,找出两个数中的最大者。
分析:我的思路是用a-b,看一下结果是正还是负,不用判断语句,不能与0比较,可以将两者的差值赋给int型变量c,看一下c的最高位是0还是1,同样不能用switch来判断。可以定义一个数组num[2]={a,b},c进行右移位操作,c>>=31(32位操作系统)。当a>b时,c的值为零,返回num【c】,既是a,同理当a<b时,返回num【c】,既是b,因此代码如下:
int a,b;
cin>>a>>b;
int num[2]={a,b};
int c=a-b;
c>>=31;
cout<<num[c]<<endl;
然而程序的输出结果并不正确,当a大时,没有问题,当b大时,通过单步调试看到c的值为-1!!
然后查了一下带符号整数的移位问题,总结如下:
1、负整数的二进制表示:
对于负整数比如-5,
化为二进制数:10000000 00000000 00000000 00000101
其反码表示为:11111111 11111111 11111111 11111010
其补码表示为:11111111 11111111