C++中位运算的一个小疑点
C++中位运算的一个小问题#include iostreamusing namespace stdint main(){int n8int an28int b
C++中位运算的一个小问题
#include <iostream>
using namespace std;
int main()
{
int n=8;
int a=n<<28;
int b=n>>1;
cout<<"a="<<a<<endl;
cout<<"b="<<b<<endl;
return 0;
}
为什么结果a=-2147483648 ??
8的2进制是 00000000 00000000 00000000 00001000
a应该是 10000000 00000000 00000000 00000000
这为什么是 -2147483648?不是0吗?
[解决办法]你这个数是有符号数,是这样算的 -1*2^32 + 0*2^31 + 0*2^30 + ……+ 0*2^0
第一位取负的,其他都是正的。
比如:11111111 11111111 11111111 11111111 也就是 FF FF FF FF按这种方法计算出来就是 -1
[解决办法]说错了...是-1*2^31 + 0*2^30 + 0*2^29 + ……+ 0*2^0 所以最后结果是 -2^31 , 也就是你看到的-2147483648
[解决办法]1000 0000
表面上看应该是-0 ,可是不对就只好是-128了
[解决办法]
说错了...是-1*2^31 + 0*2^30 + 0*2^29 + ……+ 0*2^0 所以最后结果是 -2^31 , 也就是你看到的-2147483648
了解了,呜呜,突然想起组成原理的课了,但是10000000 00000000 00000000 00000000表示的数是0吧?
32位太长了,以8位来说:
原码+0:0000 0000
原码-0:1000 0000
反码+0:0000 0000
反码-0:1111 1111
补码0: 0000 0000
补码没有±之分,你说的那个是原码,但计算机里一般接触的都是补码。
[解决办法]对于补码, 最高位0表示正数,1表示负数。
对于正数,其余各位的值即为该数的值
对于负数,各位取反即为该数的绝对值
[解决办法]补码没有±之分,你说的那个是原码,但计算机里一般接触的都是补码。
仔细看了下,又漏字了...是补码没有±0之分
[解决办法]简单的说,10000000不表示0,所有数字格式只有所有位全为0,结果才是0。这点在设计数值格式时就考虑好的了。