位運(yùn)算補(bǔ)充:復(fù)習(xí)整數(shù)表示范圍
位運(yùn)算的示例代碼如下:
#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;//整數(shù)的16進(jìn)制表示方法,在數(shù)字前加0x,比如0x10表示的是16,0x0a表示的是10。8進(jìn)制表示發(fā)是開(kāi)始加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();
}
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;//整數(shù)的16進(jìn)制表示方法,在數(shù)字前加0x,比如0x10表示的是16,0x0a表示的是10。8進(jìn)制表示發(fā)是開(kāi)始加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字節(jié),32位,因?yàn)橛蟹?hào),所以表示范圍是[-2^31, 2^31-1]。即[-2147483648,
2147483647]。為什么負(fù)數(shù)會(huì)比整數(shù)多一個(gè)呢?
32位太長(zhǎng),我們以4位的例子來(lái)說(shuō)明。
假設(shè)一個(gè)有符號(hào)整數(shù)有4位表示,比如0111表示7,原碼1111表示-7,但是-7的補(bǔ)碼是1001,0001表示1,原碼1001表示-1,但是-1的補(bǔ)碼是1111。
那根據(jù)范圍公式,4位有符號(hào)數(shù)的范圍是[-8, 7]。
7由0111表示,那么-8是哪個(gè)表示呢?經(jīng)實(shí)驗(yàn)分析,發(fā)現(xiàn)-8的補(bǔ)碼表示為1000。為什么是這樣呢?我認(rèn)為這就是一種規(guī)定,就像為什么1表示true,0表示false呢?都是規(guī)定,記住就好了。下面我根據(jù)我的理解,進(jìn)行一下?tīng)繌?qiáng)的解釋。
[-8, 7]為什么整數(shù)有7個(gè),而負(fù)數(shù)有8個(gè)?4位的組合一共有2^4共16個(gè),下面是4位編碼和表示的對(duì)照表,編碼使用補(bǔ)碼。
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
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
由此可見(jiàn),隨著二進(jìn)制表示的補(bǔ)碼的不斷增加,所表示的數(shù)從0,增加到整數(shù)最大,接著到負(fù)數(shù)最小,然后到-1。32位的int型也是這樣的。當(dāng)?shù)阶畲笳龜?shù)時(shí),再加1,就會(huì)到最小負(fù)數(shù),也就是絕對(duì)著最大的負(fù)數(shù)。
16個(gè)數(shù)中,7個(gè)整數(shù),1個(gè)零,另外7個(gè)是-1到-7。最后剩的-0,也就是1000,被定義為表示-8。
posted on 2007-04-05 13:05 daning 閱讀(988) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): others