代号moba公测时间:C++中的一个小问题

来源:百度文库 编辑:高校问答 时间:2024/05/07 03:50:49
#include <iostream.h>
void main()
{
int a(13);b(-13)
a>>=1;b>>=1
cout<<a<<b;
}
得出a为6,b为-7,而当左移时,则a,b互为相反数?请详解!
补码和原码的转换能详细讲讲么?

右移一位,即整除二。
a=13 -> 十六进制 0x0000000d -> 二进制 1101
b=-13 -> 十六进制 0xfffffff3 (它正数的补码加1)
-> 二进制 ....1111 0011
a 右移 一位:二进制 0110, 十进制 6
b 右移 一位:二进制 ...1111 1001 -> 十六进制0xfffffff9, 十进制 -7

左移一位, 即乘二
a 左移 一位:二进制 0001 1010 -> 十六进制 0x1a
-> 十进制 26
b 左移 一位:二进制 ...1110 0110 -> 十六进制 0xffffffe6 -> 十进制 -26

从bit看吧
a=00000000 00000000 00000000 00001101
b=11111111 11111111 11111111 11110011 (a+1,高位为1即可)
----------------------------------------------
1.a>>1最后一个1移出了。得
a=00000000 00000000 00000000 00000110 =6
b>>1最后一个1移出了。得
b=11111111 11111111 11111111 11111001 = -7
[注意高位补1]

既然是移位就用位来解释与理解。

两位都是高手,谢谢!