數(shù)在計算機(jī)中是以二進(jìn)制形式表示的。
數(shù)分為有符號數(shù)和無符號數(shù)。
原碼、反碼、補(bǔ)碼都是有符號定點數(shù)的表示方法。
一個有符號定點數(shù)的最高位為符號位,0是正,1是副。
以下都以8位整數(shù)為例,
原碼就是這個數(shù)本身的二進(jìn)制形式。
例如
0000001 就是+1
1000001 就是-1
正數(shù)的反碼和補(bǔ)碼都是和原碼相同。
負(fù)數(shù)的反碼是將其原碼除符號位之外的各位求反
[-3]反=[10000011]反=11111100
負(fù)數(shù)的補(bǔ)碼是將其原碼除符號位之外的各位求反之后在末位再加1。
[-3]補(bǔ)=[10000011]補(bǔ)=11111101
一個數(shù)和它的補(bǔ)碼是可逆的。
為什么要設(shè)立補(bǔ)碼呢?
第一是為了能讓計算機(jī)執(zhí)行減法:
[a-b]補(bǔ)=a補(bǔ)+(-b)補(bǔ)
第二個原因是為了統(tǒng)一正0和負(fù)0
正零:00000000
負(fù)零:10000000
這兩個數(shù)其實都是0,但他們的原碼卻有不同的表示。
但是他們的補(bǔ)碼是一樣的,都是00000000
特別注意,如果+1之后有進(jìn)位的,要一直往前進(jìn)位,包括符號位?。ㄟ@和反碼是不同的!)
[10000000]補(bǔ)
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號位變成了0)
有人會問
10000000這個補(bǔ)碼表示的哪個數(shù)的補(bǔ)碼呢?
其實這是一個規(guī)定,這個數(shù)表示的是-128
所以n位補(bǔ)碼能表示的范圍是
-2^(n-1)到2^(n-1)-1
比n位原碼能表示的數(shù)多一個
又例:
1011
原碼:01011
反碼:01011 //正數(shù)時,反碼=原碼
補(bǔ)碼:01011 //正數(shù)時,補(bǔ)碼=原碼
-1011
原碼:11011
反碼:10100 //負(fù)數(shù)時,反碼為原碼取反
補(bǔ)碼:10101 //負(fù)數(shù)時,補(bǔ)碼為原碼取反+1
0.1101
原碼:0.1101
反碼:0.1101 //正數(shù)時,反碼=原碼
補(bǔ)碼:0.1101 //正數(shù)時,補(bǔ)碼=原碼
-0.1101
原碼:1.1101
反碼:1.0010 //負(fù)數(shù)時,反碼為原碼取反
補(bǔ)碼:1.0011 //負(fù)數(shù)時,補(bǔ)碼為原碼取反+1
在計算機(jī)內(nèi),定點數(shù)有3種表示法:原碼、反碼和補(bǔ)碼
所謂原碼就是前面所介紹的二進(jìn)制定點表示法,即最高位為符號位,“0”表示正,“1”表示負(fù),其余位表示數(shù)值的大小。
反碼表示法規(guī)定:正數(shù)的反碼與其原碼相同;負(fù)數(shù)的反碼是對其原碼逐位取反,但符號位除外。
補(bǔ)碼表示法規(guī)定:正數(shù)的補(bǔ)碼與其原碼相同;負(fù)數(shù)的補(bǔ)碼是在其反碼的末位加1。
附錄:把十進(jìn)制數(shù)轉(zhuǎn)換為機(jī)器碼的C++程序代碼
#include <iostream>
using namespace std;
const int MAX = 32;
void Binary(char b[], int x); //將x轉(zhuǎn)換為二進(jìn)制數(shù)
void TrueForm(char b[], int x); //獲取原碼
void RadixMinus(char b[], int x); //獲取反碼
void Complement(char b[], int x); //獲取補(bǔ)碼
void TruthValue(char b[], int x);//獲取真值
int main()
{
int x = 1;
char b[MAX+1]={0};
cout << "十進(jìn)制數(shù):" << x << endl;
TruthValue(b, x);//獲取真值
cout << "真值:" << b << endl;
TrueForm(b, x); //獲取原碼
cout << "原碼:" << b << endl;
RadixMinus(b, x);//獲取反碼
cout << "反碼:" << b << endl;
Complement(b, x);//獲取補(bǔ)碼
cout << "補(bǔ)碼:" << b << endl;
cout << "十進(jìn)制數(shù):" << -x << endl;
TruthValue(b, -x);//獲取真值
cout << "真值:" << b << endl;
TrueForm(b, -x); //獲取原碼
cout << "原碼:" << b << endl;
RadixMinus(b, -x);//獲取反碼
cout << "反碼:" << b << endl;
Complement(b, -x);//獲取補(bǔ)碼
cout << "補(bǔ)碼:" << b << endl;
system("pause");
return 0;
}
void Binary(char b[], int x)//將x轉(zhuǎn)換為二進(jìn)制數(shù)
{
for (int i=MAX-1; i>=0; i--)
{
b[i] = (x & 1) + '0';
x >>= 1;
}
b[MAX] = '\0';
}
void TrueForm(char b[], int x) //獲取原碼:根據(jù)數(shù)學(xué)表達(dá)式求得
{
if (x >= 0)
Binary(b, x);
else
Binary(b, (1<<(MAX-1)) - x);
}
void RadixMinus(char b[], int x) //獲取反碼:正數(shù)的反碼=補(bǔ)碼;負(fù)數(shù)的反碼=補(bǔ)碼-1
{
if (x >= 0)
Binary(b, x);
else
Binary(b, x - 1);
}
void Complement(char b[], int x) //獲取補(bǔ):數(shù)據(jù)在計算機(jī)中以補(bǔ)碼形式存儲,直接轉(zhuǎn)換即可
{
Binary(b, x);
}
void TruthValue(char b[], int x)//獲取真值:根據(jù)原碼獲得真值
{
TrueForm(b, x);
b[0] = (b[0] == '0') ? '+' : '-';
}
參考文獻(xiàn):
(1)Boater的博客:《反碼和補(bǔ)碼技術(shù)是怎樣被提出的?》
http://blog.tianya.cn/blogger/post_show.asp?BlogID=227218&PostID=7046448
(2)發(fā)帖:《閑扯原碼,補(bǔ)碼和反碼》
http://m.shnenglu.com/goal00001111/
posted on 2010-09-23 19:04
王秋林 閱讀(428)
評論(0) 編輯 收藏 引用