码迷,mamicode.com
首页 > 其他好文 > 详细

左移与右移

时间:2019-08-09 13:23:27      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:vector   cout   span   div   err   负数   runtime   ios   result   

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <vector>
 4 using namespace std;
 5 typedef unsigned char byte;
 6 int main() {
 7     int x =0x800000002;//-2的原码
 8     cout << x << endl;//输出 -2147483646
 9 
10     x = 0xFFFFFFFE;//-2,说明数值是以补码的形式存储的
11     cout <<x << endl;//输出-2
12 
13     byte x3 = -2;//0xFE
14     cout <<(int)x3 << endl;//输出254
15 
16     byte x4 = 0xFE;
17     cout <<(int)x4 << endl;//输出254
18 
19     int x5 = -2;
20     x5 =x5>> 2;
21     cout << x5<< endl;//输出-1
22 
23     int x6 = 8;
24     x6 =x6>> 2;
25     cout << x6<< endl;/输出2
26 
27     int x9 = -8;
28     x9 =x9<<3;
29     cout <<x9 << endl;//输出-64
30     
31     cout << sizeof(short) << endl;//2    
32     short x10 = 8;    
33     x10 <<=32;    
34     cout<<x10<<endl;    //输出8   
35     short x11 = 0xFFFE;     
36     cout<<x11<<endl;//-2      
37     x11 >>=2;     
38     cout<<x11<<endl;//输出-1
39 
40     int x12 = -1;
41     x12 = x12 << 1;
42     cout << x12 << endl;
43     system("pause");
44     return 0;
45 }

 以上的实验说明计算机中负数是以补码的形式存在的。而且无论是负数还是整数左移就相当于乘以2,右移就相当于除以2。左移时,在后面填上0,右移时在前面补上符号位。这是算术移动。

逻辑移动就是不管往哪边移动,都补0。

 

然而我这里出现的问题是:

为什么我在vs上面进行负数移动时不会报错,在leetcode上进行移动时就会报错?

执行出错信息: Line 15: Char 27: runtime error: left shift of negative value -1 (solution.cpp)
最后执行的输入: [2,2,3,2]
 
int result = 0x00000000;
        for (int i = 31; i >= 0; i--) {
            result =result<<1;
            result += bit[i] % 3;
        }
这是leetcode代码。
 
 
 

左移与右移

标签:vector   cout   span   div   err   负数   runtime   ios   result   

原文地址:https://www.cnblogs.com/yaggy/p/11326515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!