首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++中位运算的一个小疑点

2013-12-23 
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
[解决办法]
引用:
Quote: 引用:

说错了...是-1*2^31 + 0*2^30 + 0*2^29 + ……+ 0*2^0 所以最后结果是 -2^31 , 也就是你看到的-2147483648
了解了,呜呜,突然想起组成原理的课了,但是10000000 00000000 00000000 00000000表示的数是0吧?

1000 0000  
表面上看应该是-0 ,可是不对就只好是-128了
[解决办法]
引用:
Quote: 引用:

说错了...是-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。这点在设计数值格式时就考虑好的了。

热点排行