位运算的示例代码如下:
#include <iostream>
using namespace std;
int main()
{
cout << "lenght of int = " << sizeof(int) << endl;
int a = ~5;
int b = ~(-6);
cout << "~5 = " << a << endl;
cout << "~(-6) = " << b << endl;
int i = 0x7ffffffd;//整数的16进制表示方法,在数字前加0x,比如0x10表示的是16,0x0a表示的是10。8进制表示发是开始加0,如010表示8。
cout << "i = 01111111 11111111 11111111 11111101 = " << i << endl;
i = i << 1;
cout << "i << 1 = " << i << endl;
int t = 0x7fffffff;
cout << "t = 01111111 11111111 11111111 11111111 = " << t << endl;
int k = t + 1;
cout << "k = t + 1" << endl;
cout << "k = 10000000 00000000 00000000 00000000 = " << t + 1 << endl;
cout << "k = t + 2" << endl;
cout << "k = 10000000 00000000 00000000 00000000 = " << t + 2 << endl;
getchar();
}
int型是4字节,32位,因为有符号,所以表示范围是[-2^31, 2^31-1]。即[-2147483648,
2147483647]。为什么负数会比整数多一个呢?
32位太长,我们以4位的例子来说明。
假设一个有符号整数有4位表示,比如0111表示7,原码1111表示-7,但是-7的补码是1001,0001表示1,原码1001表示-1,但是-1的补码是1111。
那根据范围公式,4位有符号数的范围是[-8, 7]。
7由0111表示,那么-8是哪个表示呢?经实验分析,发现-8的补码表示为1000。为什么是这样呢?我认为这就是一种规定,就像为什么1表示true,0表示false呢?都是规定,记住就好了。下面我根据我的理解,进行一下牵强的解释。
[-8, 7]为什么整数有7个,而负数有8个?4位的组合一共有2^4共16个,下面是4位编码和表示的对照表,编码使用补码。
0000 0
0001 1
0010 2
0011 3
0100 4
0101 5
0110 6
0111 7
1000 -8
1001 -7
1010 -6
1011 -5
1100 -4
1101 -3
1110 -2
1111 -1
由此可见,随着二进制表示的补码的不断增加,所表示的数从0,增加到整数最大,接着到负数最小,然后到-1。32位的int型也是这样的。当到最大正数时,再加1,就会到最小负数,也就是绝对着最大的负数。
16个数中,7个整数,1个零,另外7个是-1到-7。最后剩的-0,也就是1000,被定义为表示-8。