引言
?? 作者簡介:專注于C/C++高性能程序設(shè)計(jì)和開發(fā),理論與代碼實(shí)踐結(jié)合,讓世界沒有難學(xué)的技術(shù)。包括C/C++、Linux、MySQL、Redis、TCP/IP、協(xié)程、網(wǎng)絡(luò)編程等。
??
??? CSDN實(shí)力新星,社區(qū)專家博主
??
?? 專欄介紹:從零到c++精通的學(xué)習(xí)之路。內(nèi)容包括C++基礎(chǔ)編程、中級(jí)編程、高級(jí)編程;掌握各個(gè)知識(shí)點(diǎn)。
??
?? 專欄地址:C++從零開始到精通
??
?? 博客主頁:https://blog.csdn.net/Long_xu
?? 上一篇:【006】C++數(shù)據(jù)類型之進(jìn)制間的轉(zhuǎn)換
?? 下一篇:【008】C++數(shù)據(jù)類型之重要關(guān)鍵字詳解
一、原碼、補(bǔ)碼、反碼的概述
計(jì)算機(jī)存儲(chǔ)的是數(shù)據(jù)的補(bǔ)碼。
-
原碼:計(jì)算機(jī)中對(duì)數(shù)字的二進(jìn)制定點(diǎn)表示方法。比如123的原碼是0111 1011。
-
無符號(hào)數(shù):原碼=反碼=補(bǔ)碼。
-
有符號(hào)數(shù):要分正數(shù)和負(fù)數(shù),正數(shù)的最高位為0,負(fù)數(shù)的最高位為1。其中,正數(shù)的原碼、反碼、補(bǔ)碼都是相同的;負(fù)數(shù)的反碼等于原碼的符號(hào)數(shù)(最高位)不變,其他位取反;補(bǔ)碼等于反碼+1。
比如:-123的原碼是1111 1011,反碼為1000 0100,補(bǔ)碼為1000 0101。
原碼、補(bǔ)碼和反碼都是用于計(jì)算機(jī)表示有符號(hào)整數(shù)的方法。
-
原碼:最高位表示符號(hào)位,0為正數(shù),1為負(fù)數(shù),其余位表示數(shù)值。例如,+3的8位原碼為00000011,-3的8位原碼為10000011。
-
反碼:在原碼基礎(chǔ)上,負(fù)數(shù)的表示方法改為將除了符號(hào)位以外的所有位取反(即0變1,1變0)。例如,-3的8位反碼為11111100。
-
補(bǔ)碼:在反碼基礎(chǔ)上再加1得到的結(jié)果,即負(fù)數(shù)的補(bǔ)碼是其對(duì)應(yīng)正數(shù)的原碼按位取反再加1。例如,-3的8位補(bǔ)碼為11111101。
負(fù)數(shù)在計(jì)算機(jī)中以補(bǔ)碼形式存儲(chǔ);非負(fù)數(shù)在計(jì)算機(jī)中以原碼形式存儲(chǔ)。
二、為什么要使用補(bǔ)碼?
使用補(bǔ)碼可以簡化計(jì)算機(jī)中的運(yùn)算邏輯,同時(shí)還能避免原碼和反碼中出現(xiàn)的“零”問題,即正數(shù)的反碼和補(bǔ)碼等于原碼,而負(fù)數(shù)的反碼和補(bǔ)碼不等于原碼,因此沒有正零和負(fù)零的區(qū)別。
(1)統(tǒng)一了 0 的編碼:
+0補(bǔ)碼:0000 0000
-0補(bǔ)碼:0000 0000
(2)將減法運(yùn)算變加法運(yùn)算:
// 沒有補(bǔ)碼的情況
10: 0000 1010
-6: 1000 0110
---------------
---- 1001 0000
// 結(jié)果是16,有問題
// 有了補(bǔ)碼
10: 0000 1010
-6: 1111 1010
---------------
---- 0000 0100
// 溢出位會(huì)被移除,結(jié)果等于4,滿足運(yùn)算結(jié)果
三、對(duì)數(shù)據(jù)的存
負(fù)數(shù)在計(jì)算機(jī)中以補(bǔ)碼的方式存儲(chǔ)。
非負(fù)數(shù)、八進(jìn)制數(shù)、十六進(jìn)制數(shù)等在計(jì)算機(jī)以原碼的方式存儲(chǔ)。
示例:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
short data=-10;
cout<<bitset<16>(data)<<endl;
data=10;
cout<<bitset<16>(data)<<endl;
data=0x80;
cout<<bitset<16>(data)<<endl;
return 0;
}
輸出:
1111111111110110
0000000000001010
0000000010000000
四、對(duì)數(shù)據(jù)的取
- 如果是對(duì)無符號(hào)變量進(jìn)行取值,輸出內(nèi)存的原樣數(shù)據(jù)。
- 如果是對(duì)有符號(hào)變量進(jìn)行取值,系統(tǒng)會(huì)去看內(nèi)存的最高位,如果最高位為0表明是正數(shù),內(nèi)存原樣輸出。如果最高位是1表示負(fù)數(shù),將內(nèi)存數(shù)據(jù)求補(bǔ)碼(得到原碼)輸出。
示例:
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
unsigned short data = -10;
cout << bitset<16>(data) << endl;
cout << dec << data << endl;
data = 10;
cout << bitset<16>(data) << endl;
cout << dec << data << endl;
short data2 = 0x8080;
cout << bitset<16>(data2) << endl;
cout << data2 << endl;
return 0;
}
輸出:
1111111111110110
65526
0000000000001010
10
1000000010000000
-32640
總結(jié)
原碼是數(shù)值的二進(jìn)制表示方法,其中最高位表示符號(hào)位,0表示正數(shù),1表示負(fù)數(shù)。
補(bǔ)碼是為了解決原碼運(yùn)算中存在的符號(hào)位帶來的問題而提出的一種方法。在補(bǔ)碼中,正數(shù)的補(bǔ)碼與原碼相同,而負(fù)數(shù)的補(bǔ)碼則是其對(duì)應(yīng)正數(shù)的反碼加1。
反碼也是為了解決原碼運(yùn)算中存在的符號(hào)位帶來的問題而提出的一種方法。在反碼中,正數(shù)的反碼與原碼相同,而負(fù)數(shù)的反碼則是將其對(duì)應(yīng)正數(shù)的二進(jìn)制表示中每一位取反。但是,反碼存在一個(gè)問題:它有兩個(gè)0表示+0和-0,這會(huì)導(dǎo)致計(jì)算機(jī)在進(jìn)行數(shù)學(xué)運(yùn)算時(shí)出現(xiàn)不確定性。文章來源:http://www.zghlxwxcb.cn/news/detail-451697.html
總之,補(bǔ)碼是目前計(jì)算機(jī)內(nèi)部存儲(chǔ)和運(yùn)算使用的一種數(shù)值表示方法,因?yàn)樗梢员苊獬霈F(xiàn)不確定性的情況。而原碼和反碼則只在理論上有一定的意義,在實(shí)際編程中很少使用。文章來源地址http://www.zghlxwxcb.cn/news/detail-451697.html
到了這里,關(guān)于【007】C++數(shù)據(jù)類型之原碼、補(bǔ)碼、反碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!