C語(yǔ)言中進(jìn)制知識(shí)匯總
1.什么是進(jìn)制
進(jìn)制是一種計(jì)數(shù)的方式,常用的有二進(jìn)制、八進(jìn)制、十進(jìn)制、十六進(jìn)制。任何數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式存放的。
我對(duì)進(jìn)制的個(gè)人理解,二進(jìn)制數(shù)是以2為計(jì)算單元,滿2進(jìn)1位的數(shù);八進(jìn)制數(shù)是以8為計(jì)算單元,滿8進(jìn)1位的數(shù)。
對(duì)于任何一個(gè)數(shù)字,我們都可以用不同的進(jìn)制來表示,比如,十進(jìn)制數(shù)12,用二進(jìn)制表示為1100,用八進(jìn)制表示為14,用十六進(jìn)制表示為0xC。
2.進(jìn)制的轉(zhuǎn)換規(guī)則
遵循滿進(jìn)制值進(jìn)1位,個(gè)位數(shù)變?yōu)?的原理,下面我們以十進(jìn)制數(shù)18為例,對(duì)1-18中每一個(gè)數(shù)值轉(zhuǎn)換各種進(jìn)制做一個(gè)詳細(xì)說明
轉(zhuǎn)二進(jìn)制:
1小于2,無(wú)需進(jìn)1位,1的二進(jìn)制值是1
2為二進(jìn)制值1后面一個(gè)數(shù),由于1+1滿2,需要進(jìn)1位,個(gè)位數(shù)變?yōu)?,所以2的二進(jìn)制值是10
3為二進(jìn)制值10后面一個(gè)數(shù),由于11的個(gè)位數(shù)1小于2,無(wú)需進(jìn)1位,所以3的二進(jìn)制值是11
4為二進(jìn)制值11后面一個(gè)數(shù),由于11的個(gè)位數(shù)1+1滿2,需要進(jìn)1位,而二進(jìn)制值11的位數(shù)1+1又滿2,所以位數(shù)加1,最終轉(zhuǎn)換結(jié)果為100
轉(zhuǎn)換思路:二進(jìn)制值11+1 ->10+(1+1)(個(gè)位等于2,進(jìn)1位,個(gè)位數(shù)變?yōu)?) ->(1+1)+0(位數(shù)滿2,進(jìn)1位) -> 100
以此類推,最終十進(jìn)制數(shù)18的二進(jìn)制轉(zhuǎn)換結(jié)果是10010
轉(zhuǎn)八進(jìn)制:
1-7小于8,無(wú)需進(jìn)1位,1-7的八進(jìn)制由1-7表示
8為八進(jìn)制值7后面一個(gè)數(shù),由于7+1滿8,需要進(jìn)1位,個(gè)位數(shù)變?yōu)?,所以8的八進(jìn)制值是10
以此類推,最終十進(jìn)制數(shù)18的八進(jìn)制轉(zhuǎn)換結(jié)果是22
轉(zhuǎn)十六進(jìn)制
十六進(jìn)制中,個(gè)位數(shù)1-15分別為1 2 3 4 5 6 7 8 9 a b c d e f (a=10....f=15)
16為十六進(jìn)制值c后面1個(gè)數(shù),由于c+1滿16,需要進(jìn)1位,個(gè)位數(shù)變?yōu)?,所以16的十六進(jìn)制是10。
最終十進(jìn)制數(shù)18的十六進(jìn)制轉(zhuǎn)換結(jié)果是12
詳細(xì)結(jié)果如下圖所示(C語(yǔ)言把數(shù)字前面加0x的數(shù)認(rèn)為是十六進(jìn)制數(shù))
3.C語(yǔ)言中int類型進(jìn)制的聲明以及占位符
雖然以下3個(gè)變量的賦值方式不同,但實(shí)際賦值結(jié)果都是18
八進(jìn)制占位符:%o
十六進(jìn)制占位符:%x
4.內(nèi)存存儲(chǔ)數(shù)據(jù)細(xì)節(jié)
我們知道,int類型數(shù)據(jù)占據(jù)4個(gè)字節(jié),1個(gè)字節(jié)是8bit。并且任何數(shù)據(jù)在計(jì)算機(jī)內(nèi)存中都是以二進(jìn)制的形式存放的,所以內(nèi)存需要用32個(gè)0或1來描述1個(gè)int類型數(shù)據(jù)。
由于18的二進(jìn)制數(shù)是10010,我們將一個(gè)int類型變量賦值18,本質(zhì)上是將這個(gè)變量的內(nèi)存地址對(duì)應(yīng)的32個(gè)bit位修改為:
0000 0000 0000 0000 0000 0000 0001 0010(未滿31位,后面的數(shù)字用0填充:為什么是31而不是32呢,后面會(huì)介紹)
假設(shè)我們定義兩個(gè)變量
//二進(jìn)制類型數(shù)字加0b int number1 = 0b10010; //八進(jìn)制類型數(shù)字加0 int number2 = 022; //十六進(jìn)制類型數(shù)字加0x int number3 = 0x12;
計(jì)算機(jī)會(huì)根據(jù)內(nèi)存地址以由大到小的順序進(jìn)行分配內(nèi)存空間,具體如下圖所示:
5.進(jìn)制的轉(zhuǎn)換公式
二進(jìn)制轉(zhuǎn)十進(jìn)制
0b1100 ->0*2的0次方 + 0*2的1次方 + 1*2的2次方 + 1*2的3次方 = 12
十進(jìn)制轉(zhuǎn)二進(jìn)制
67 ->64+2+1 ->2的6次方+ 2的1次方 + 2的0次方 = 0b1000011
6.進(jìn)制的其他知識(shí)
1.n位二進(jìn)制能保存的整數(shù)范圍公式:2的n次方-1
例如,3位的二進(jìn)制數(shù)最大值為111,對(duì)應(yīng)的十進(jìn)制數(shù)字為7;5位的二進(jìn)制數(shù)最大值為11111,對(duì)應(yīng)的十進(jìn)制數(shù)字為(2*2*2*2*2)-1 = 31。
2.負(fù)數(shù)的二進(jìn)制保存規(guī)則是最左邊的數(shù)字是1。例如,0000 0000 0000 0000 0000 0000 0001 0010 表示正整數(shù),1111 1111 1111 1111 1111 1111 1110 1101表示負(fù)數(shù)
由此,我們就能推測(cè)出,int類型能保存的最大整數(shù)是2的(32-1)次方-1 =2147483647。為什么要用32-1,很簡(jiǎn)單,32個(gè)bit中,必須抽1個(gè)bit位用來描述這個(gè)數(shù)字是正數(shù)還是負(fù)數(shù)。
相關(guān)文章
C++11系列學(xué)習(xí)之可調(diào)用對(duì)象包裝器和綁定器
這篇文章主要介紹了C++11系列學(xué)習(xí)之可調(diào)用對(duì)象包裝器和綁定器,下文基于C++的相關(guān)資料展開詳細(xì)內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下2022-04-04C語(yǔ)言實(shí)現(xiàn)簡(jiǎn)易版掃雷的完整過程
這篇文章主要給大家介紹了關(guān)于利用C語(yǔ)言如何實(shí)現(xiàn)簡(jiǎn)易版掃雷的完整過程,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12C++ LeetCode1796字符串中第二大數(shù)字
這篇文章主要為大家介紹了C++ LeetCode1796字符串中第二大數(shù)字示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問題
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)之迷宮求解問題,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03C語(yǔ)言簡(jiǎn)明介紹常見關(guān)鍵字的用法
關(guān)鍵字是C語(yǔ)言非常重要的一部分,熟練的掌握和使用關(guān)鍵字有助于我們更加熟悉了解C語(yǔ)言,同時(shí)C語(yǔ)言的關(guān)鍵字也是面試筆試中常考的內(nèi)容。C語(yǔ)言的關(guān)鍵字共有32個(gè),但并不是每個(gè)關(guān)鍵字都有坑,本篇文章將通過理論聯(lián)系實(shí)際的方式為大家講解C語(yǔ)言中易混易錯(cuò)以及??嫉囊恍╆P(guān)鍵字2022-06-06淺談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存
下面小編就為大家?guī)硪黄獪\談在函數(shù)中返回動(dòng)態(tài)的內(nèi)存。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-12-12