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上进行移动时就会报错?
最后执行的输入: [2,2,3,2]
int result = 0x00000000;
for (int i = 31; i >= 0; i--) {
result =result<<1;
result += bit[i] % 3;
}
for (int i = 31; i >= 0; i--) {
result =result<<1;
result += bit[i] % 3;
}
这是leetcode代码。