網(wǎng)站亂碼問題我們會(huì)經(jīng)常碰到,大多見于非英文的中文字符或其他字符亂碼不皆,而且未檩,這類問題常常是因?yàn)榫幋a方式問題,主要原因就是所保存的編碼方式和瀏覽器解析時(shí)用的編碼方式不一致導(dǎo)致粟焊。解決辦法就是要知道自己是用什么編碼方式保存的,并告訴瀏覽器用你指定的編碼方式去解析(在html
的 <head>
里添加<meta charset="編碼方式">
)孙蒙,否則项棠,瀏覽器就會(huì)用默認(rèn)的編碼方式解析,如果兩者不一致則會(huì)亂碼挎峦。
以上一段話香追,實(shí)際已經(jīng)可以解決標(biāo)題的問題了。但字符編碼(常見有:ASCII坦胶、GB2312透典、GBK、ISOLatin-1顿苇、Unicode峭咒、UTF-8)是計(jì)算機(jī)存儲(chǔ)技術(shù)的基礎(chǔ)知識(shí),我覺得還是有必要了解更多一些纪岁,比如:為什么計(jì)算機(jī)非要是二進(jìn)制而不是其他進(jìn)制呢凑队?二進(jìn)制是怎么產(chǎn)生的?計(jì)算機(jī)是怎么通過(guò)二進(jìn)制存儲(chǔ)和讀取的幔翰?我們電腦上的內(nèi)存和硬盤有何種區(qū)別漩氨?32位和64位操作系統(tǒng)指的又是什么?CPU的各種性能指標(biāo)和二進(jìn)制的關(guān)系遗增?編程又和這些有何關(guān)系叫惊?等等問題,于是在開啟了搜索模式后做修,便有了下面這個(gè)很長(zhǎng)很長(zhǎng)的故事:
字符編碼涉及歷史久遠(yuǎn)霍狰,專業(yè)術(shù)語(yǔ)多,又是計(jì)算機(jī)的基礎(chǔ)缓待,為了讓自己對(duì)“字符編碼”又更加深入的認(rèn)識(shí)蚓耽,以下內(nèi)容參考和閱讀了大量的文章資料,為了讓大家讀上去更有趣旋炒,有些內(nèi)容在自己消化后稍有修改步悠,文章太多,無(wú)法一一聯(lián)系授權(quán)瘫镇,侵刪鼎兽。(大概來(lái)自于百科答姥、文庫(kù)、知乎谚咬、博客園鹦付、CSDN、維基百科择卦、谷歌敲长、饑人谷講師若愚直播課、阮一峰博客等)秉继,文內(nèi)難免有理解錯(cuò)誤之處祈噪,請(qǐng)多指正。
關(guān)于進(jìn)位制的發(fā)現(xiàn)
我們都知道現(xiàn)在人類是離不開數(shù)學(xué)運(yùn)算的尚辑,我們古人呢辑鲤?他們也需要計(jì)數(shù)啊,比如我打的獵物要怎么樣分配給我的愛妃們杠茬?我們現(xiàn)在自然很容易理解進(jìn)位制的(十進(jìn)制月褥、二進(jìn)制、七進(jìn)制瓢喉、八進(jìn)制宁赤、十二進(jìn)制、十六進(jìn)制灯荧,二十進(jìn)制礁击、六十進(jìn)制)運(yùn)算,但那個(gè)時(shí)候我們的古人可不懂啊逗载,人類在很久很久以前哆窿,對(duì)于10以上的數(shù)字是沒有概念的。大家都是就著自己的手指頭數(shù)數(shù)厉斟,數(shù)到10就達(dá)到了極限挚躯。后來(lái)有個(gè)基因突變的天才發(fā)明了一種做法(可能他發(fā)現(xiàn)了復(fù)雜的數(shù)字都是由簡(jiǎn)單的數(shù)字多次相加得來(lái)的道理),讓人類的數(shù)數(shù)能力獲得了質(zhì)的飛升擦秽。他是這么做的:數(shù)完了自己的手指頭码荔,就在自己的身前放一顆小石子(人類的邏輯思維是需要不斷進(jìn)化的,當(dāng)時(shí)可能還記不赘谢印)缩搅。然后讓自己的手指頭“清零”,繼續(xù)數(shù)數(shù)触幼。數(shù)完所有東西后硼瓣,再回來(lái)數(shù)數(shù)小石子。于是,人類發(fā)明了二位數(shù)堂鲤。二位數(shù)發(fā)明之后亿傅,三位數(shù)發(fā)明也不遠(yuǎn)了,后來(lái)不僅出現(xiàn)了十進(jìn)制(手指)瘟栖,還出現(xiàn)了二十進(jìn)制(手指+腳指)葵擎,再后來(lái)發(fā)現(xiàn)了二進(jìn)制、七進(jìn)制半哟、八進(jìn)制酬滤、十六進(jìn)制、甚至還有六十進(jìn)制寓涨。十進(jìn)制是我們現(xiàn)在最能理解和接受的敏晤,我們看到100立刻能明白它的意思,但如果看到二進(jìn)制1100100肯定是懵逼的缅茉。所以,二進(jìn)制雖然最簡(jiǎn)單男摧,只需要兩個(gè)基本數(shù)值0和1蔬墩,但使用使用起來(lái)卻很麻煩,假如你打獵收獲3個(gè)獵物耗拓,就得進(jìn)位拇颅,而進(jìn)位的計(jì)算本來(lái)就麻煩,故而乔询,瑪雅人寧可使用二十進(jìn)制數(shù)完手指再數(shù)腳指也不愿進(jìn)位樟插。再后來(lái),古人有了月份和地支的概念后竿刁,十二進(jìn)制得以使用(還有個(gè)說(shuō)法是人類除大拇指外的其余四根手指都可彎曲為三節(jié)黄锤,三四得十二)愚隧。再再后來(lái)掩蛤,有了十六進(jìn)制,這個(gè)主要用在計(jì)算重量單位扣典,比如十六兩合一斤负甸。二十進(jìn)制據(jù)說(shuō)是瑪雅人在用流强,與使用十進(jìn)制的人群如華夏人相比,瑪雅人在數(shù)二十以內(nèi)的獵物時(shí)不需要進(jìn)位呻待,數(shù)完手指再數(shù)腳指就可以了打月,這可能會(huì)產(chǎn)生一種思維惰性;華夏人數(shù)到十一個(gè)獵物就得進(jìn)位蚕捉,迫使向更復(fù)雜的進(jìn)位運(yùn)算前進(jìn)奏篙,這就使一個(gè)種族在數(shù)學(xué)水平上先進(jìn)了一步。六十進(jìn)制主要源于中國(guó)十天干與十二地支的組合鱼冀,也僅用于干支紀(jì)年报破。西方用于分割時(shí)間上的小時(shí)和分鐘悠就。七進(jìn)制東西方都在使用,西方把七天作為一個(gè)周期充易,周而復(fù)始地循環(huán)梗脾;中國(guó)則把一個(gè)月分為四個(gè)星期,大月30天則有兩周是8天盹靴,小月29天則有一周是8天炸茧,雖與西方固定的七天不同,但中國(guó)把日月五星謂之七政稿静,也稱“七曜”梭冠,算是巧合吧。這么多進(jìn)制改备,只有十進(jìn)制最為流行控漠,可能源于這和我們身體結(jié)構(gòu)相似有關(guān),另外悬钳,八進(jìn)制和十六進(jìn)制最后在計(jì)算機(jī)中得到了廣泛使用盐捷。這些進(jìn)制里面,只有二進(jìn)制最為簡(jiǎn)單默勾,這也是計(jì)算機(jī)為何采用二進(jìn)制而非其他進(jìn)制的原因之一碉渡。當(dāng)然,肯定不只這一個(gè)原因了母剥,下面會(huì)有講滞诺。
擴(kuò)展閱讀:古人的繩結(jié)計(jì)數(shù)法
摩爾斯碼的發(fā)現(xiàn)
這里還有個(gè)重要的時(shí)間點(diǎn)需要提一下,就是1837年环疼,也就是美國(guó)科學(xué)家莫爾斯發(fā)明的莫爾斯電碼习霹,他嘗試用一些代碼比如: 點(diǎn)、劃炫隶、點(diǎn)和劃之間的停頓序愚、每個(gè)字符間短的停頓(在點(diǎn)和劃之間)、每個(gè)詞之間中等的停頓以及句子之間長(zhǎng)的停頓來(lái)表示不同的字母等限、數(shù)字和標(biāo)點(diǎn)符號(hào)爸吮!
為何要提它呢?它本身和二進(jìn)制是有區(qū)別的望门,但注意時(shí)間點(diǎn)形娇,我認(rèn)為后面發(fā)現(xiàn)二進(jìn)制并誕生計(jì)算機(jī)和這個(gè)存在關(guān)系,而且它除了是一種重要的遠(yuǎn)距離通訊手段外(二戰(zhàn)期間被大量使用)筹误,更重要的是有助于我們理解字符集的問題桐早,這個(gè)文章后面會(huì)解釋到。
摩爾斯電碼,實(shí)際上就是符號(hào)與字母數(shù)字的對(duì)應(yīng)哄酝。
電報(bào)的原理是:“點(diǎn)”對(duì)應(yīng)于短的電脈沖信號(hào)友存,“劃”對(duì)應(yīng)于長(zhǎng)的電脈沖信號(hào),這些信號(hào)傳到對(duì)方陶衅,接收機(jī)把短的電脈沖信號(hào)翻譯成“點(diǎn)”屡立,把長(zhǎng)的電脈沖信號(hào)轉(zhuǎn)換成“劃”膨俐,譯碼員根據(jù)這些點(diǎn)劃組合就可以譯成英文字母罩句,從而完成了通信任務(wù)。
這里每一個(gè)符號(hào)其實(shí)就是一個(gè)字符乳愉;
而這所有的字符的集合就叫做字符集;
“點(diǎn)”或“劃”與字符之間的對(duì)應(yīng)關(guān)系即可以理解為字符編碼屯远;
把字符表示為“點(diǎn)”或“劃”并對(duì)應(yīng)為電脈沖信號(hào)的過(guò)程既是編碼氓润;
譯碼員把接收機(jī)接收到的脈沖信號(hào)轉(zhuǎn)化成點(diǎn)劃后譯成字符的過(guò)程即為解碼。
擴(kuò)展閱讀:
布萊葉盲文與二進(jìn)制
電報(bào)機(jī)的原理
半導(dǎo)體特性的發(fā)現(xiàn)
- 1833年挖滤,英國(guó)的巴拉迪發(fā)現(xiàn)硫化銀材料的電阻是隨著溫度的上升而降低伶唯。
- 1839年乳幸,法國(guó)的貝克萊爾發(fā)現(xiàn)半導(dǎo)體和電解質(zhì)接觸形成的結(jié),在光照下會(huì)產(chǎn)生一個(gè)電壓瓶埋,這是被發(fā)現(xiàn)的半導(dǎo)體的第二個(gè)特征-光生伏特效應(yīng)。
- 1874年曾撤,德國(guó)的布勞恩發(fā)現(xiàn)某些硫化物的電導(dǎo)與所加電場(chǎng)的方向有關(guān),即它的導(dǎo)電有方向性尖啡,在它兩端加一個(gè)正向電壓衅斩,它是導(dǎo)通的;如果把電壓極性反過(guò)來(lái)奠涌,它就不導(dǎo)電,這就是半導(dǎo)體所特有的第三種特性-半導(dǎo)體的整流效應(yīng)慈格。同年浴捆,舒斯特又發(fā)現(xiàn)了銅與氧化銅的整流效應(yīng)。
- 1873年页眯,英國(guó)的史密斯又發(fā)現(xiàn)了硒晶體材料在光照下電導(dǎo)增加。半導(dǎo)體的光電導(dǎo)效應(yīng)被發(fā)現(xiàn)忿族。
半導(dǎo)體特性的發(fā)現(xiàn)和應(yīng)用使得人類從電力時(shí)代步入到了信息時(shí)代道批。這為計(jì)算機(jī)的產(chǎn)生提供了可能椭岩,為何這么說(shuō)判哥?因?yàn)榘雽?dǎo)體被發(fā)現(xiàn)的特性使得它能夠?qū)崿F(xiàn)電流的“開、關(guān)”功能(原理在下面)锌仅,這是個(gè)很重要的發(fā)現(xiàn)。聰明的人類利用半導(dǎo)體材料發(fā)明了二極管伊脓,而且這個(gè)功能是計(jì)算機(jī)誕生的基石!
二極管的原理
上面說(shuō)了,半導(dǎo)體可以實(shí)現(xiàn)電流“開祷蝌、關(guān)”功能,其基本原理在于PN結(jié)糊啡,即由帶正電的P型半導(dǎo)體(以空穴為載流子)和以帶負(fù)電的N型半導(dǎo)體(以電子為載流子)形成的界面結(jié)堕扶。
擴(kuò)展資料:半導(dǎo)體中的兩種載流子-電子和空穴是如何產(chǎn)生和運(yùn)動(dòng)的?
-
如果加P到N的正向電壓糊探,則空穴和電子都將流向該區(qū)并中和對(duì)方的離子使得該區(qū)范圍不斷減小直至導(dǎo)通。
- 如果加N到P的方向電壓,則空穴和電子朝反方向運(yùn)動(dòng)汞贸,空間電荷區(qū)將不斷增大,電流無(wú)法通過(guò)多柑。
現(xiàn)在我們把一個(gè)討厭電子的半導(dǎo)體(N型半導(dǎo)體)和一個(gè)喜歡電子的半導(dǎo)體(P型半導(dǎo)體)放在一起的時(shí)候,在它們之間就會(huì)形成一個(gè)空間電荷區(qū)初嘹,也就是電子趨向的力量(半導(dǎo)體畢竟不是導(dǎo)體,半導(dǎo)體的原子核對(duì)電子的束縛力是足夠大的驻龟,因此雖然有趨向,但不足以讓一側(cè)的電子跑到另一側(cè) --- 這也就是為什么它叫做“半導(dǎo)體”)露懒,這就是一個(gè)二極管了窃躲。當(dāng)二極管外部有電流通過(guò)的時(shí)候蒂窒,如果外部電流內(nèi)的電子的運(yùn)動(dòng)方向順從了其內(nèi)部的這種電子的趨向,則這個(gè)二極管可以視為接通的導(dǎo)線;而如果外部電流的電子運(yùn)動(dòng)方向和二極管內(nèi)部的電子方向相反的時(shí)候呛踊,外部電流就無(wú)法通過(guò)這個(gè)二極管(除非加了很高的反向電壓 ----- 這樣就會(huì)將二極管擊穿),此時(shí)這個(gè)二極管可以視為斷路愉择。所以在二極管的電路里,根據(jù)二極管兩端的電壓的高低的不同层坠,就能測(cè)出某些電阻兩端的電壓有不同的數(shù)值:高或者低。就是說(shuō)PN結(jié)就可以識(shí)別正反向電壓旧乞,或者通過(guò)不同方向電壓就可以控制電路的通或斷嫡纠,這就實(shí)現(xiàn)了“是”與“非”的兩個(gè)狀態(tài)并可以對(duì)其加以控制叉橱,來(lái)判斷“0”與“1”這種狀態(tài)窃祝,這樣就為實(shí)現(xiàn)二進(jìn)制的邏輯運(yùn)算提供了可能大磺,盡管電子在電路中的運(yùn)動(dòng)速率要遠(yuǎn)小于光速,但是建立電路關(guān)聯(lián)只和電場(chǎng)存在與否相關(guān)流济,電場(chǎng)是以近光速運(yùn)動(dòng)的,這就能實(shí)現(xiàn)電路中的快速響應(yīng)也就等效于快速運(yùn)算,這也是“電腦”能比人腦快得多的原因姨丈。
注意:這里的0和1只是邏輯表現(xiàn)方法,物理表示就是高電位和低電位,比如可以這樣規(guī)定:1就表示高電壓沐绒,0就表示低電壓。不要把0和1理解為阿拉伯?dāng)?shù)字中的0和1
二進(jìn)制的發(fā)現(xiàn)
對(duì)于二進(jìn)制蹋肮,目前世界數(shù)學(xué)界公認(rèn)的是德國(guó)數(shù)理哲學(xué)大師萊布尼茨坯辩。對(duì)坷檩,就是那個(gè)和牛頓獨(dú)立發(fā)現(xiàn)微積分的大神。實(shí)際上裸删,我國(guó)古人的智慧成果--八卦,就是使用陰陽(yáng)兩種元素來(lái)表示天地萬(wàn)物的。于是我搜了一下還真有資料榛搔,這里面還有個(gè)故事:
萊布尼茨在20多歲的時(shí)候就已經(jīng)接觸到了中國(guó)的《易經(jīng)》,后于1697年發(fā)明了二進(jìn)制,但由于沒有強(qiáng)有力的證據(jù)侦铜,也沒多少人理解,一直沒發(fā)表。后來(lái)31歲時(shí)又接觸到了古老《易經(jīng)》里伏羲畫的六十四卦卦符羞秤,發(fā)現(xiàn)和二進(jìn)制的數(shù)碼相對(duì)應(yīng),這給了他極大的啟發(fā)和鼓舞哺哼,于1705年發(fā)表了二進(jìn)制。《周易》歸妹章就是講二進(jìn)制的:二進(jìn)制碼的每位數(shù)都是2的n次冪六三辭 “歸妹以須蹂午,反歸以娣,歸冪以須,反歸一遞估盘,歸冪以須,數(shù)碼位數(shù)依須要而定,夠用為限班套,多了無(wú)益《幻海”這句話對(duì)今天的航天仍具指導(dǎo)意義。航天器上的空間比同體積的黃金還貴,儲(chǔ)存器的位數(shù)決定衛(wèi)星的造價(jià)调窍。反歸一遞--卦符的上爻位是2的0次冪1的位置,因易的行文順序是由初爻(下爻,2的5次冪位)開始依次向上降冪:5褐耳、4襟雷、3咧虎、2、1茁彭、0 的順序,故說(shuō)反歸一遞年枕。《易經(jīng)》還記載:易有太級(jí)毫别,是分兩儀台丛,兩儀生四象砾肺,四象生八卦挽霉,八卦化萬(wàn)物。后來(lái)变汪,萊布尼茲也曾預(yù)言過(guò)八卦會(huì)引起世界性的變革O揽病(老祖宗牛逼叭苟堋)
放個(gè)兩個(gè)鏈接:
八卦與二進(jìn)制的關(guān)系
周易中的二進(jìn)制數(shù)學(xué)
很可惜的是实胸,二進(jìn)制作為一種進(jìn)位制的計(jì)數(shù)方法,誰(shuí)發(fā)明并沒有多大差別番官,因?yàn)樗臀覀兊氖M(jìn)制一樣并不是什么很高級(jí)的思想庐完。上面講了,古人就在用進(jìn)制徘熔,它只是人們規(guī)定的一種進(jìn)位方法门躯。對(duì)于任何一種進(jìn)制---X進(jìn)制,就表示某一位置上的數(shù)運(yùn)算時(shí)是逢X進(jìn)一位酷师。十進(jìn)制是逢十進(jìn)一讶凉,十六進(jìn)制是逢十六進(jìn)一,二進(jìn)制就是逢二進(jìn)一山孔,每一種數(shù)制都使用位置表示法缀遍。處于不同位置的數(shù)符所代表的值不同,與它所在位的權(quán)值有關(guān)饱须。
十進(jìn)制1234.55可表示為:
1234.55=1×103+2×102+3×101+4×100+5×10(-1)+5×10(-2)域醇。
可以看出,各種進(jìn)位計(jì)數(shù)制中權(quán)的值恰好是基礎(chǔ)的某次冪。因此譬挚,對(duì)任何一種進(jìn)位計(jì)數(shù)制表示的數(shù)都可以寫成按權(quán)展開的多項(xiàng)式锅铅,也就說(shuō)明各種進(jìn)制之間可以相互轉(zhuǎn)化的。比如十進(jìn)制中11這個(gè)數(shù)計(jì)算公式就是這樣的:1×10^1 + 1×10^0 = 11减宣。二進(jìn)制1011這個(gè)數(shù)計(jì)算公式就是這樣的:1011 = 1×2^3 + 0×2^2 + 1×2^1 + 1×2^0 = 8 + 0 + 2 + 1 = 11盐须,不論是二進(jìn)制1011還是十進(jìn)制11,都代表同一個(gè)數(shù)字11漆腌。
二進(jìn)制作為計(jì)數(shù)方法確實(shí)夠簡(jiǎn)單贼邓,目前我們不可能找到比二進(jìn)制數(shù)字系統(tǒng)更簡(jiǎn)單的數(shù)字系統(tǒng)了(如果把數(shù)字1去掉,就只剩下0一個(gè)數(shù)字闷尿,只有一個(gè)數(shù)字0的數(shù)字系統(tǒng)是什么都做不成的)塑径。雖然二進(jìn)制作為計(jì)數(shù)方法并不驚艷,但二進(jìn)制數(shù)字系統(tǒng)架起了算術(shù)與電之間的橋梁填具,我們把二進(jìn)制跟布爾代數(shù)统舀,跟數(shù)字電路聯(lián)系起來(lái)后,則成就了計(jì)算機(jī)二進(jìn)制理論劳景,而計(jì)算機(jī)是影響人類的重大發(fā)明誉简。
計(jì)算機(jī)中的二進(jìn)制
自18世紀(jì)萊布尼茲發(fā)現(xiàn)二進(jìn)制(基數(shù)為2,只用0和1兩個(gè)數(shù)表示盟广,“逢二進(jìn)一”闷串,“借一當(dāng)二”)后,人類開動(dòng)自己的聯(lián)想筋量,產(chǎn)生了很多有趣的關(guān)聯(lián)窿克。比如上面我們了解的開關(guān)、電線毛甲、燈泡年叮、繼電器、二極管等物體都可以表示二進(jìn)制數(shù)0和1:
電線可以表示二進(jìn)制數(shù)字玻募。有電流代表數(shù)字1只损;沒有,則代表數(shù)字0七咧。
開關(guān)可以表示二進(jìn)制數(shù)字跃惫。開關(guān)閉合,代表數(shù)字1艾栋;開關(guān)斷開爆存,代表數(shù)字0。
燈泡可以表示二進(jìn)制數(shù)字蝗砾。燈泡亮先较,代表數(shù)字1携冤;沒亮,代表數(shù)字0闲勺。
電報(bào)繼電器表示二進(jìn)制數(shù)字曾棕。繼電器閉合,代表數(shù)字1菜循;繼電器斷開翘地,代表數(shù)字0。
受到啟發(fā)后癌幕,聰明的人類將二進(jìn)制就和二極管產(chǎn)生了聯(lián)系,再后來(lái)又腦洞大開勺远,決定用8個(gè)可以開合的晶體管(一個(gè)開關(guān)囊拜,用“開”來(lái)表示1某筐,“關(guān)”來(lái)表示0)來(lái)組合成不同的狀態(tài),以表達(dá)更多的信息冠跷。后來(lái)南誊,他們看到8個(gè)開關(guān)運(yùn)行狀態(tài)正常后,給這8個(gè)狀態(tài)起了個(gè)名字叫--“字節(jié)”蜜托。再后來(lái)抄囚,他們覺得8個(gè)狀態(tài)的字節(jié)還可以組合出更多狀態(tài)來(lái),表達(dá)更多的信息橄务,于是他們又做了一些可以處理這些“字節(jié)”的機(jī)器幔托,在看到他們也運(yùn)轉(zhuǎn)正常后,覺得這一定是上帝的旨意蜂挪。于是重挑,他們給這個(gè)機(jī)器又起了一個(gè)非常牛逼的名字--“計(jì)算機(jī)”(當(dāng)時(shí)一臺(tái)計(jì)算機(jī)足有一間半教室那么大,六頭大象的重量)棠涮。所以谬哀,我們明白了計(jì)算機(jī)中的二進(jìn)制實(shí)際上就是一個(gè)非常微小的開關(guān),用“開”來(lái)表示1严肪,“關(guān)”來(lái)表示0史煎,0和1各占一個(gè)“位”谦屑,用8個(gè)不同狀態(tài)的0和1表示“字節(jié)”,通過(guò)“字節(jié)”組合不同的狀態(tài)來(lái)存儲(chǔ)和運(yùn)算不同數(shù)據(jù)劲室。
擴(kuò)展閱讀:
第一代計(jì)算機(jī)-電子管計(jì)算機(jī)
第二代計(jì)算機(jī)-晶體管計(jì)算機(jī)
計(jì)算機(jī)中為什么要用二進(jìn)制而不是其他進(jìn)制伦仍?
計(jì)算機(jī)使用二進(jìn)制是由它的實(shí)現(xiàn)機(jī)理決定的。上面說(shuō)過(guò)很洋,電腦的基層部件是由集成電路組成的充蓝,這些集成電路可以看成是一個(gè)個(gè)門電路組成,(當(dāng)然事實(shí)上沒有這么簡(jiǎn)單的)喉磁。當(dāng)計(jì)算機(jī)工作的時(shí)候谓苟,電路通電工作,于是每個(gè)輸出端就有了電壓协怒。電壓的高低通過(guò)模數(shù)轉(zhuǎn)換即轉(zhuǎn)換成了二進(jìn)制:高電平是由1表示涝焙,低電平由0表示。也就是說(shuō)將模擬電路轉(zhuǎn)換成為數(shù)字電路孕暇。這里的高電平與低電平可以人為確定仑撞,一般地,2.5伏以下即為低電平妖滔,3.2伏以上為高電平隧哮。電子計(jì)算機(jī)能以極高速度進(jìn)行信息處理和加工,包括數(shù)據(jù)處理和加工座舍,而且有極大的信息存儲(chǔ)能力沮翔。數(shù)據(jù)在計(jì)算機(jī)中以器件的物理狀態(tài)表示,采用二進(jìn)制數(shù)字系統(tǒng)曲秉,計(jì)算機(jī)處理所有的字符或符號(hào)也要用二進(jìn)制編碼來(lái)表示采蚀。用二進(jìn)制的優(yōu)點(diǎn)主要在于:
- 技術(shù)實(shí)現(xiàn)簡(jiǎn)單,計(jì)算機(jī)是由邏輯電路組成承二,邏輯電路通常只有兩個(gè)狀態(tài)榆鼠,開關(guān)的接通與斷開,這兩種狀態(tài)正好可以用“1”和“0”表示亥鸠。
- 簡(jiǎn)化運(yùn)算規(guī)則:兩個(gè)二進(jìn)制數(shù)和妆够、積運(yùn)算組合各有三種,運(yùn)算規(guī)則簡(jiǎn)單读虏,有利于簡(jiǎn)化計(jì)算機(jī)內(nèi)部結(jié)構(gòu)责静,提高運(yùn)算速度。
- 適合邏輯運(yùn)算:邏輯代數(shù)是邏輯運(yùn)算的理論依據(jù)盖桥,二進(jìn)制只有兩個(gè)數(shù)碼灾螃,正好與邏輯代數(shù)中的“真”和“假”相吻合。
- 易于進(jìn)行轉(zhuǎn)換:二進(jìn)制與十進(jìn)制數(shù)易于互相轉(zhuǎn)換揩徊。
- 抗干擾能力強(qiáng):因?yàn)槊课粩?shù)據(jù)只有高低兩個(gè)狀態(tài)腰鬼,當(dāng)受到一定程度的干擾時(shí)嵌赠,仍能可靠地分辨出它是高還是低,可靠性高熄赡。
除了以上優(yōu)點(diǎn)外姜挺,采用二進(jìn)制還有個(gè)客觀原因在于,人們知道彼硫,具有兩種穩(wěn)定狀態(tài)的元件(如晶體管的導(dǎo)通和截止炊豪,繼電器的接通和斷開,電脈沖電平的高低等)在那個(gè)時(shí)代容易找到拧篮,而要找到來(lái)對(duì)應(yīng)十進(jìn)制的10個(gè)數(shù)的具有10種穩(wěn)定狀態(tài)的元件在那個(gè)時(shí)代就非常困難了词渤。這也是計(jì)算機(jī)為何采用二進(jìn)制而非人類更熟悉的十進(jìn)制的原因吧。
為什么又會(huì)出現(xiàn)八進(jìn)制串绩、十六進(jìn)制缺虐?
人類一般思維方式是以十進(jìn)制來(lái)表示的,而計(jì)算機(jī)則是二進(jìn)制礁凡,但是對(duì)于編程人員來(lái)說(shuō)高氮,都是需要直接與計(jì)算器打交道的,如果給我們一大串的二進(jìn)制數(shù)顷牌。比如說(shuō)一個(gè)4個(gè)字節(jié)的int型的數(shù)據(jù):0000 1010 1111 0101 1000 1111 11111 1111剪芍,我想任何程序員看到這樣一大串的0、1都會(huì)很蛋疼韧掩。所以必須要有一種更加簡(jiǎn)潔靈活的方式來(lái)呈現(xiàn)這對(duì)數(shù)據(jù)了紊浩。你也許會(huì)說(shuō)窖铡,直接用十進(jìn)制吧疗锐,如果是那樣,就不能準(zhǔn)確表達(dá)計(jì)算機(jī)思維方式了(二進(jìn)制)费彼,所以滑臊,出現(xiàn)了八進(jìn)制、十六進(jìn)制箍铲,其實(shí)十六進(jìn)制應(yīng)用的更加廣泛雇卷,就比如說(shuō)上面的int型的數(shù)據(jù),直接轉(zhuǎn)換為八進(jìn)制的話颠猴,32./3 余2 也就是說(shuō)关划,我們還要在前面加0,但是轉(zhuǎn)換為十六進(jìn)制就不同了翘瓮。32/4=8贮折,直接寫成十六進(jìn)制的8個(gè)數(shù)值拼接的字符串,簡(jiǎn)單明了资盅。所以說(shuō)用十六進(jìn)制表達(dá)二進(jìn)制字符串無(wú)疑是最佳的方式调榄,這就是八進(jìn)制和十六進(jìn)制出現(xiàn)的原因踊赠。
擴(kuò)展閱讀:各進(jìn)制之間如何轉(zhuǎn)換
進(jìn)制間的相互轉(zhuǎn)換問題
-
八進(jìn)制、十六進(jìn)制每庆、二進(jìn)制轉(zhuǎn)為十進(jìn)制
都是按權(quán)展開的多項(xiàng)式相加得到十進(jìn)制的結(jié)果筐带。
比如:
二進(jìn)制1010.1到十進(jìn)制:1×2^3 + 0×2^2 + 1×2^1 + 0×2^0 + 1×2^(-1)=10.5
八進(jìn)制13.1到十進(jìn)制:1×8^1 + 3×8^0 + 1×8^(-1)=11.125
十六進(jìn)制13.1到十進(jìn)制:1×16^1 + 3×16^0 + 1×16^(-1)=19.0625 -
十進(jìn)制轉(zhuǎn)為八進(jìn)制、十六進(jìn)制缤灵、二進(jìn)制
都是按照整數(shù)部分除以基數(shù)(r)取余伦籍,小數(shù)部分乘以基數(shù)(r)取整。
十進(jìn)制10.25 到二進(jìn)制:整數(shù)部分除2腮出,一步步取余鸽斟。小數(shù)部分乘2,一步步取整利诺。
八進(jìn)制到十進(jìn)制富蓄,十六進(jìn)制到十進(jìn)制都是和上面的一樣,只不過(guò)不在是除2乘2慢逾,而是8或者16了立倍,這是根據(jù)自己的基數(shù)來(lái)決定的。 -
二進(jìn)制轉(zhuǎn)為八進(jìn)制侣滩、十六進(jìn)制
二進(jìn)制轉(zhuǎn)換成八進(jìn)制的方法是:從小數(shù)點(diǎn)起口注,把二進(jìn)制數(shù)每三位分成一組,小數(shù)點(diǎn)前面的不夠三位的前面加0君珠,小數(shù)點(diǎn)后面的不夠三位的后面加0寝志,然后寫出每一組的對(duì)應(yīng)的十進(jìn)制數(shù),順序排列起來(lái)就得到所要求的八進(jìn)制數(shù)了策添。
依照同樣的思想咪鲜,將一個(gè)八進(jìn)制數(shù)的每一位,按照十進(jìn)制轉(zhuǎn)換二進(jìn)制的方法扒披,變成用三位二進(jìn)制表示的序列典阵,然后按照順序排列,就轉(zhuǎn)換為二進(jìn)制數(shù)了浸颓。
二進(jìn)制數(shù)10101111.10111轉(zhuǎn)換為八進(jìn)制的數(shù):
(010 101 111.101 110)= 2 5 7.5 6=257.56
八進(jìn)制數(shù)257.56轉(zhuǎn)換為二進(jìn)制的數(shù):
257.56 =(010 101 111.101 110)=10101111.101
二進(jìn)制轉(zhuǎn)換到十六進(jìn)制差不多:從小數(shù)點(diǎn)起物臂,把二進(jìn)制數(shù)每四位分成一組,小數(shù)點(diǎn)前面的不夠四位的前面加0产上,小數(shù)點(diǎn)后面的不夠四位的后面加0棵磷,然后寫出每一組的對(duì)應(yīng)的十進(jìn)制數(shù),然后將大于9的數(shù)寫成如下的形式:
10---->A晋涣,11--->B仪媒,12---->C,13---->D姻僧,14--->E规丽,15--->F
在順序排列起來(lái)就得到所要求的十六進(jìn)制了蒲牧。
同樣,將一個(gè)十六進(jìn)制數(shù)的每一位赌莺,按照十進(jìn)制轉(zhuǎn)換二進(jìn)制的方法冰抢,變成用四位二進(jìn)制表示的序列,然后按照順序排列艘狭,就轉(zhuǎn)換為二進(jìn)制數(shù)了挎扰。
二進(jìn)制數(shù)10101111.10111轉(zhuǎn)換為十六進(jìn)制的數(shù):
(1010 1111.1011 1000)=A F.B 8=AF.B8
十六進(jìn)制AF.B8轉(zhuǎn)換為二進(jìn)制:
AF.B8=(1010 1111.1011 1000)=10101111.10111
計(jì)算機(jī)中二進(jìn)制何以表達(dá)萬(wàn)物?它是如何讀懂二進(jìn)制碼的巢音?
計(jì)算機(jī)是怎樣用二進(jìn)制0和1來(lái)表達(dá)信息的遵倦,甚至號(hào)稱可以表達(dá)宇宙萬(wàn)物所有信息呢?
我們知道編程語(yǔ)言里的基本數(shù)據(jù)類型官撼,都是以符合人類世界和自然世界的邏輯而出現(xiàn)的梧躺,便于讓人更容易理解,可以說(shuō)傲绣,這些數(shù)據(jù)類型是架通人類思維與計(jì)算機(jī)的橋梁掠哥。
但是我們同時(shí)也知道,依照馮諾依曼體系秃诵,計(jì)算機(jī)中并沒有這些數(shù)據(jù)類型续搀,而全部都是0和1表示的二進(jìn)制數(shù)據(jù),并且計(jì)算器只能理解這些0和1的數(shù)據(jù)菠净。既然禁舷,所有的數(shù)據(jù)在計(jì)算機(jī)里面都是以0和1存儲(chǔ)和運(yùn)算的,那么毅往,符合我們?nèi)祟愃季S的數(shù)據(jù)則都要通過(guò)一定的轉(zhuǎn)換才能被正確的存儲(chǔ)到計(jì)算機(jī)中牵咙。轉(zhuǎn)化的原理是什么呢?
舉個(gè)栗子:假如你看上一個(gè)學(xué)妹煞抬,你想表白霜大,所以你送了她一件禮物构哺,如果學(xué)妹接受了禮物表示接受你革答,決絕了禮物表示拒絕你。也就是我們可以用0和1來(lái)表達(dá)學(xué)妹的態(tài)度(實(shí)際情況可能更復(fù)雜)曙强。
再舉個(gè)栗子:有兩個(gè)人A和B去看了一個(gè)電影残拐,怎么用0和1表示呢?我們用0代表討厭碟嘴,1代表喜歡溪食。會(huì)出現(xiàn):
00 = AB都不喜歡這影片
01 = A討厭它,B喜歡它
10 = B喜歡它娜扇,A討厭它
11 = AB都很喜歡這影片
如果加上我的觀點(diǎn)呢错沃,它就變成2^3次方=8種可能了栅组。如:000、001枢析、010玉掸、011、100醒叁、101司浪、110、111把沼,所以啊易,計(jì)算機(jī)的二進(jìn)制雖然無(wú)法和人一樣理解那么多,但有了這0和1饮睬,計(jì)算機(jī)就可以通過(guò)“開”和“關(guān)”的狀態(tài)來(lái)做二元邏輯判斷(真假租谈、對(duì)錯(cuò)、是否等非黑即白的問題)了捆愁,不要小看這二元邏輯判斷垦垂,不客氣的說(shuō)它確實(shí)可以表達(dá)宇宙萬(wàn)物(道德經(jīng):道生一,一生二牙瓢,二生三劫拗,三生萬(wàn)物)!我們不要忘記矾克,發(fā)明二進(jìn)制的萊布尼茲不但是個(gè)數(shù)學(xué)家页慷,還是個(gè)牛逼的哲學(xué)家啊,他一直試圖用數(shù)學(xué)符號(hào)和操作符來(lái)表達(dá)亞里士多德的邏輯理論胁附,而且他也是最接近這個(gè)目標(biāo)的人酒繁,直到后來(lái)喬治·布爾在概念上的突破成果--布爾代數(shù)的出現(xiàn)。
大部分計(jì)算機(jī)內(nèi)部的連接是一樣的控妻,都是通過(guò)電氣信號(hào)來(lái)進(jìn)行通信的州袒,也就是電壓高低的變化,這些電流會(huì)經(jīng)過(guò) MOSFET 晶體管弓候,晶體管中包含 N 型半導(dǎo)體和 P 型半導(dǎo)體郎哭,通過(guò)電壓就能控制線路開閉,然后這些 MOSFET 構(gòu)成了 CMOS菇存,接著再由 CMOS 實(shí)現(xiàn)「與」「或」「非」等邏輯電路門夸研,最后由邏輯電路門上就能實(shí)現(xiàn)加法、位移等計(jì)算依鸥。
配套邏輯運(yùn)算:與亥至、或、非。
- 與:只要有0結(jié)果就是0姐扮。比如1與0等于0絮供。
- 或:只要有1結(jié)果就是1。比如1與0等于1茶敏。
- 非:翻轉(zhuǎn)杯缺。0變1、1變0睡榆。
還有其他邏輯運(yùn)算如同或萍肆、異或等。
后來(lái)胀屿,有了算法塘揣,而算法中又有三種基本結(jié)構(gòu)方式:順序、選擇宿崭、循環(huán)亲铡。
而這三種結(jié)構(gòu)可以涵蓋所有情況,沒有例外葡兑。舉個(gè)栗子:
a---餓了想要吃點(diǎn)兒東西奖蔓。
b---循壞進(jìn)食的動(dòng)作10次。
c---如果吃飽了讹堤,到d吆鹤;否則,到b洲守。
d---結(jié)束進(jìn)食的動(dòng)作疑务。
如果這還不足以說(shuō)服你,只能建議你去研究圖靈機(jī)了梗醇。圖靈機(jī)處理信息遠(yuǎn)比這個(gè)復(fù)雜的多知允。還以上面的舉例:
a---餓了想要吃點(diǎn)兒東西。
b---循壞進(jìn)食的動(dòng)作10次叙谨。(該減肥了?是則掛起,否則繼續(xù))
c---如果吃飽了温鸽,到d;否則手负,到b涤垫。
d---結(jié)束進(jìn)食的動(dòng)作。
如果b反復(fù)執(zhí)行到一半的時(shí)候虫溜,你發(fā)現(xiàn)自己是不是該考慮減肥了雹姊。如果是,這時(shí)候圖靈機(jī)就會(huì)立刻優(yōu)先對(duì)這個(gè)新的減肥輸入進(jìn)行處理而會(huì)將循環(huán)進(jìn)食的動(dòng)作掛起衡楞,如果不是,則喚醒剛才被掛起的動(dòng)作,繼續(xù)進(jìn)行瘾境。也就是說(shuō)我們每個(gè)人都是一個(gè)非常非常復(fù)雜的圖靈機(jī)歧杏,上面只是一種情況,而人的情況指令要比這個(gè)例子復(fù)雜的多迷守,這也是為什么人工智能總是達(dá)不到真實(shí)人的程度犬绒,當(dāng)然,如果這個(gè)理論正確兑凿,假設(shè)我們也是高級(jí)文明創(chuàng)造的復(fù)雜版的圖靈機(jī)的話凯力,誰(shuí)又能保證人工智能不會(huì)進(jìn)化呢?所以礼华,這個(gè)宇宙中的一切咐鹤,都可以抽象成圖靈機(jī),二進(jìn)制可以表達(dá)一切圣絮!
雖然祈惶,這個(gè)世界上的所有事件,都可以用順序扮匠、選擇捧请、循環(huán)三種邏輯來(lái)表示。雖然二進(jìn)制可以表達(dá)宇宙萬(wàn)物棒搜。但是疹蛉,可以表達(dá)一切現(xiàn)象并不代表可以解決一切問題。
例如:顯示自己本身的所有代碼力麸。
比如有這樣一個(gè)程序氧吐,就一行:
顯示(100)
這個(gè)程序就做一件事情:顯示數(shù)字100。
問題來(lái)了末盔,你如何把“顯示(100)”這兩個(gè)漢字一組括號(hào)和一個(gè)數(shù)字100顯示出來(lái)呢筑舅?
似乎應(yīng)該這樣:
顯示(顯示(100))
但是其實(shí)當(dāng)你這樣做的時(shí)候,你已經(jīng)改變了程序本身陨舱,現(xiàn)在的程序?yàn)閮蓚€(gè)“顯示”兩組括號(hào)和一個(gè)100翠拣,而你運(yùn)行程序后只能顯示一個(gè)“顯示”一組括號(hào)和一個(gè)100,很顯然你并沒有把這個(gè)程序全部顯示出來(lái)游盲。
類似這樣的問題误墓,就是計(jì)算機(jī)無(wú)法解決的問題(好像類似先有蛋還是先有雞的問題)。
再比如“背包問題-貪心算法”(一種組合優(yōu)化的NP完全問題):
一個(gè)小偷去博物館偷東西益缎。博物館內(nèi)有3件物品谜慌。
第一件物品的重量為3, 價(jià)值為4莺奔;
第二件物品的重量為2欣范, 價(jià)值為3;
第三件物品的重量為4, 價(jià)值為5恼琼;
小偷的背包最多可以承受的重量為7妨蛹。
請(qǐng)問:應(yīng)該如何拿物品,可以讓背包里的物品總價(jià)值最大(不能重復(fù)裝入)晴竞?
這個(gè)問題似乎非常簡(jiǎn)單蛙卤,稍微比較后就會(huì)得出結(jié)論:拿第一件和第三件物品。
但是噩死,如果我們擴(kuò)大一下問題:如果有6件物品颤难、背包可以承受的重量也提高一些,應(yīng)該怎么拿已维?這個(gè)時(shí)候如果讓計(jì)算機(jī)去解決這個(gè)問題行嗤,我們就會(huì)發(fā)現(xiàn)當(dāng)問題的規(guī)模擴(kuò)大1倍后,計(jì)算機(jī)所需要的時(shí)間卻擴(kuò)大了遠(yuǎn)不止1倍 --- 即解決問題所需時(shí)間不再是線性變化了衣摩。
就拿這個(gè)問題來(lái)說(shuō)昂验,如果物品數(shù)量超過(guò)十幾個(gè),那么計(jì)算機(jī)要想解決這個(gè)問題所需要的時(shí)間就已經(jīng)超過(guò)了100年艾扮。
這類問題是計(jì)算機(jī)或者說(shuō)用那三種邏輯順序可以解決的既琴、但是所需要的時(shí)間是人類無(wú)法容忍的。
擴(kuò)展閱讀:
邏輯門電路
邏輯與泡嘴、或甫恩、非
認(rèn)識(shí)圖靈機(jī)
數(shù)學(xué)危機(jī)與圖靈機(jī)
圖靈機(jī)視頻
如何自己造一臺(tái)8位計(jì)算機(jī)
二進(jìn)制和編程有什么關(guān)系?
計(jì)算機(jī)讀取二進(jìn)制編碼酌予,不是單純的二進(jìn)制數(shù)磺箕,而是嚴(yán)格按照一定的格式來(lái)編碼的。讀指令這些操作都是靠計(jì)算機(jī)里的CPU來(lái)進(jìn)行的抛虫,按照馮諾依曼體系松靡,CPU里有一個(gè)控制寄存器(一堆代表0和1的開關(guān))。這樣我們可以用一組二進(jìn)制數(shù)來(lái)描述這個(gè)控制寄存器的狀態(tài)建椰。開關(guān)的多少就是一條指令的長(zhǎng)度雕欺,我們經(jīng)常見的32位機(jī),就是一條指令長(zhǎng)為32棉姐,就是這個(gè)控制有32個(gè)小開關(guān)屠列。同樣64位機(jī)有64個(gè)。在寄存器內(nèi)伞矩,各個(gè)位有的是單獨(dú)工作的笛洛,有的是好幾個(gè)一起工作的,我們把他們分成一個(gè)個(gè)小組乃坤。有的組是表示狀態(tài)的苛让,只能讀不能寫沟蔑,或者說(shuō)寫了也沒用。而有的組是可以操作的蝌诡。而且這些組是可以在一定條件下改變的溉贿,用來(lái)實(shí)現(xiàn)某個(gè)功能枫吧。對(duì)于那些可以操作的寄存器是有特定功能的浦旱,比如說(shuō)有個(gè)開關(guān)你撥一下,它就伸出個(gè)腿什么的九杂,你撥回去它就縮回來(lái)颁湖。這樣我們按照上面的格式寫給CPU一串二進(jìn)制編碼,他就能按照我們意愿完成某個(gè)動(dòng)作例隆。這個(gè)編碼格式其實(shí)就跟你喊:電腦甥捺,電腦,給我個(gè)雞腿镀层!或者:媽镰禾,我餓了!是一樣一樣的唱逢。這些二進(jìn)制0和1的編碼動(dòng)輒幾十位吴侦,電腦是好認(rèn)了,可是讓程序員怎么讀坞古?既然上面說(shuō)的格式固定备韧,那就用一些字符來(lái)代替寄存器組吧!這樣匯編語(yǔ)言就誕生了痪枫,當(dāng)然匯編是按照機(jī)器的模式來(lái)的织堂,還是不好理解,那C語(yǔ)言等等一些語(yǔ)言就出來(lái)了奶陈。而我們也有代碼寫了易阳!程序員干的工作實(shí)際上就是,為了讓計(jì)算機(jī)解決某個(gè)問題而使用某種程序設(shè)計(jì)語(yǔ)言編寫程序(編譯后的代碼集合)來(lái)和計(jì)算機(jī)溝通吃粒,并最終得到相應(yīng)結(jié)果的過(guò)程潦俺。程序員寫好的程序會(huì)按照CPU能認(rèn)識(shí)的格式來(lái)生成二進(jìn)制文件,每條指令的長(zhǎng)度固定声搁。這樣CPU每次讀一點(diǎn)黑竞,按照讀出的指令來(lái)完成相應(yīng)的動(dòng)作,然后再讀下一條疏旨。這樣就可以完成程序交給它的任務(wù)了很魂。當(dāng)然不同的CPU的控制寄存器個(gè)數(shù)不相同,但是大致原理都差不多檐涝。也就是說(shuō)遏匆,程序員干的事實(shí)際就是在和計(jì)算機(jī)約會(huì)法挨。(程序員沒有女朋友難道是這個(gè)原因?)
內(nèi)存是怎么工作的幅聘?
-
DRAM基本組成
內(nèi)存是由DRAM(動(dòng)態(tài)隨機(jī)存儲(chǔ)器)芯片組成的凡纳。DRAM的內(nèi)部結(jié)構(gòu)可以說(shuō)是PC芯片中最簡(jiǎn)單的,是由許多重復(fù)的“單元”——cell組成帝蒿,每一個(gè)cell由一個(gè)電容和一個(gè)晶體管(一般是N溝道MOSFET)構(gòu)成荐糜,電容可儲(chǔ)存1bit數(shù)據(jù)量,充放電后電荷的多少(電勢(shì)高低)分別對(duì)應(yīng)二進(jìn)制數(shù)據(jù)0和1葛超。由于電容會(huì)有漏電現(xiàn)象暴氏,因此過(guò)一段時(shí)間之后電荷會(huì)丟失,導(dǎo)致電勢(shì)不足而丟失數(shù)據(jù)绣张,因此必須經(jīng)常進(jìn)行充電保持電勢(shì)答渔,這個(gè)充電的動(dòng)作叫做刷新,因此動(dòng)態(tài)存儲(chǔ)器具有刷新特性侥涵,這個(gè)刷新的操作一直要持續(xù)到數(shù)據(jù)改變或者斷電沼撕。而MOSFET則是控制電容充放電的開關(guān)。DRAM由于結(jié)構(gòu)簡(jiǎn)單芜飘,可以做到面積很小务豺,存儲(chǔ)容量很大。
-
內(nèi)存地址
內(nèi)存中的cell按矩陣形排列燃箭,每一行和每一列都會(huì)有一個(gè)對(duì)應(yīng)的行地址線路(正規(guī)叫法叫做word line)和列地址線路(正規(guī)叫法是bit line)冲呢,每個(gè)具體的cell就掛接在這樣的行地址線路和列地址線路上,對(duì)應(yīng)一個(gè)唯一的行號(hào)和列號(hào)招狸,把行號(hào)和列號(hào)組合在一起敬拓,就是內(nèi)存的地址。
上圖是Thaiphoon Burner的一個(gè)SPD dump裙戏,每個(gè)地址是一個(gè)字節(jié)乘凸。不過(guò)我們可以把這些數(shù)據(jù)假設(shè)成只有一個(gè)bit,當(dāng)成是一個(gè)簡(jiǎn)單的內(nèi)存地址表累榜,左邊豎著的是行地址营勤,上方橫著的是列地址。例如我們要找第七行壹罚、倒數(shù)第二列(地址為7E)的數(shù)據(jù)葛作,它就只有一個(gè)對(duì)應(yīng)的值:FD。當(dāng)然了猖凛,在內(nèi)存的cell中赂蠢,它只能是0或者1。計(jì)算機(jī)會(huì)把所有的信息都給數(shù)字化辨泳,所以它知道自已把一個(gè)數(shù)據(jù)虱岂,一條命令記到了內(nèi)存中的哪個(gè)(些)位置玖院。
內(nèi)存地址是內(nèi)存當(dāng)中存儲(chǔ)數(shù)據(jù)的一個(gè)標(biāo)識(shí),并不是數(shù)據(jù)本身第岖,通過(guò)內(nèi)存地址可以找到內(nèi)存當(dāng)中存儲(chǔ)的數(shù)據(jù)难菌。 -
尋址
數(shù)據(jù)要寫入內(nèi)存的一個(gè)cell,或者從內(nèi)存中的一個(gè)cell讀取數(shù)據(jù)蔑滓,首先要完成對(duì)這個(gè)cell的尋址郊酒。尋址的過(guò)程,首先是將需要操作的cell的對(duì)應(yīng)行地址信號(hào)和列地址信號(hào)輸入行/列地址緩沖器烫饼,然后先通過(guò)行解碼器(Row Decoder)選擇特定的行地址線路猎塞,以激活特定的行地址试读。每一條行地址線路會(huì)與多條列地址線路和cell相連接杠纵,為了偵測(cè)列地址線路上微弱的激活信號(hào),還需要一個(gè)額外的感應(yīng)放大器(Sense Amplifier)放大這個(gè)信號(hào)钩骇。當(dāng)行激活之后比藻,列地址緩沖器中的列地址信號(hào)通過(guò)列解碼器(Column Decoder)確定列地址,并被對(duì)應(yīng)的感應(yīng)放大器通過(guò)連接IO線路倘屹,這樣cell就被激活银亲,并可供讀寫操作,尋址完成纽匙。從行地址激活务蝠,到找到列地址這段時(shí)間,就是tRCD烛缔。
舉例說(shuō)明
擴(kuò)展閱讀:
內(nèi)存工作原理
計(jì)算機(jī)如何存儲(chǔ)數(shù)據(jù)的馏段?
數(shù)據(jù)類型一般分類基本數(shù)據(jù)類型和復(fù)合數(shù)據(jù)類型,復(fù)合數(shù)據(jù)類型也是由基本數(shù)據(jù)類型構(gòu)成的践瓷。所以院喜,這里先只討論基本數(shù)據(jù)類型(無(wú)符號(hào)整形,帶符號(hào)整形晕翠,實(shí)型喷舀,char型)的存儲(chǔ)情況。
- 存儲(chǔ)無(wú)符號(hào)整形:無(wú)符號(hào)整形在數(shù)據(jù)中的存儲(chǔ)無(wú)疑是最方便的淋肾,因?yàn)闆]有符號(hào)位硫麻,只表示正數(shù),所以在存儲(chǔ)計(jì)算方面都很簡(jiǎn)單樊卓。無(wú)符號(hào)整形在就是以純粹的二進(jìn)制串存儲(chǔ)在計(jì)算機(jī)中的拿愧。比如說(shuō)看下面的例子:
從輸出的十六進(jìn)制數(shù)中可以看出,它就是以直接的二進(jìn)制數(shù)表示的简识。 - 存儲(chǔ)帶符號(hào)整形:對(duì)于帶符號(hào)數(shù)赶掖,機(jī)器數(shù)的最高位是表示正感猛、負(fù)號(hào)的符號(hào)位,其余位則表示數(shù)值奢赂。先不談其他的問題陪白,只談二進(jìn)制表達(dá)數(shù)據(jù)的問題,看下面的例子:
假設(shè)機(jī)器字長(zhǎng)為8的話:
一個(gè)十進(jìn)制的帶符號(hào)整形1膳灶,表達(dá)為二進(jìn)制就是(0000 0001)
一個(gè)十進(jìn)制的帶符號(hào)整形-1咱士,表達(dá)為二進(jìn)制就是(1000 0001)
那么,兩者相加 轧钓,用十進(jìn)制運(yùn)算 1+(-1)=0
在看二進(jìn)制運(yùn)算(0000 0010)+(1000 0001)=(1000 0010)這個(gè)數(shù)轉(zhuǎn)換為十進(jìn)制結(jié)果等于-2序厉。可以發(fā)現(xiàn)出問題了毕箍,這就是今天所要講的原碼弛房。
原碼
數(shù)值X的原碼記為[x]原,如果機(jī)器字長(zhǎng)為n(即采用n個(gè)二進(jìn)制位表示數(shù)據(jù))而柑。則最高位是符號(hào)位文捶。0表示正號(hào),1表示負(fù)號(hào)媒咳,其余的n-1位表示數(shù)值的絕對(duì)值粹排。數(shù)值0的原碼表示有兩種形式:[+0]原=0000 0000,-[0]原=1000 0000涩澡。
例子:若機(jī)器字長(zhǎng)n=8顽耳,則
[+1]原=0000 0001 [-1]原=1000 0001
[+127]原=0111 1111 [-127]原=1111 1111
[+45]原=0010 1101 [-45]原=1010 1101
可見,原碼妙同,在計(jì)算數(shù)值上出問題了射富,當(dāng)然,你也可以實(shí)驗(yàn)下渐溶,原碼在計(jì)算正數(shù)和正數(shù)的時(shí)候辉浦,它是一點(diǎn)問題都沒有的,但是出現(xiàn)負(fù)數(shù)的時(shí)候就出現(xiàn)問題了茎辐。所以還需要講一個(gè)問題:反碼
反碼
數(shù)值X的反碼記作[x]反宪郊,如果機(jī)器字長(zhǎng)為n,則最高位是符號(hào)位拖陆,0表示正號(hào)弛槐,1表示負(fù)號(hào),正數(shù)的反碼與原碼相同依啰,負(fù)數(shù)的反碼則是其絕對(duì)值按位求反乎串。數(shù)值0的反碼表示有兩種形式:[+0]反=0000 0000,-[0]反=1111 1111速警。
例子:若機(jī)器字長(zhǎng)n等于8叹誉,則
[+1]反=0000 0001 [-1]反=1111 1110
[+127]反=0111 1111 [-127]反=1000 0000
[+45]反=0010 1101 [-45]反=1101 0010
在看反碼計(jì)算的問題:
1+(-1)=0 |(0000 0001)反+(1111 1110)反=(1111 1111)反=(1000 0000)原=【-0】可以看到鸯两,雖然是-0,但是問題還不是很大长豁。
1+(-2)=-1 |(0000 0001)反+(1111 1101)反=(1111 1110)反=(1000 0001)原=【-1】 可以看到钧唐,沒有問題。
-1+(2)=1 |(1111 1110)反+(0000 0010)反=(0000 0000)反=(0000 0000)原=【0】可以看到匠襟,問題發(fā)生了钝侠,因?yàn)橐绯觯瑢?dǎo)致結(jié)果變?yōu)?了酸舍。
所以帅韧,看以看到,用反碼表示啃勉,問題依然沒有解決忽舟,所以,還需要一個(gè)東西-補(bǔ)碼璧亮。
補(bǔ)碼
數(shù)值X的補(bǔ)碼記作[x]補(bǔ)萧诫,如果機(jī)器字長(zhǎng)為n,則最高位是符號(hào)位枝嘶,0表示正號(hào),1表示負(fù)號(hào)哑诊,正數(shù)的補(bǔ)碼與原碼反碼都相同群扶,負(fù)數(shù)的補(bǔ)碼則等于其反碼的末尾加1。數(shù)值0的補(bǔ)碼表示有唯一的編碼:[+0]補(bǔ)=0000 0000镀裤,-[0]補(bǔ)=0000 0000竞阐。
例子:若機(jī)器字長(zhǎng)n等于8,則
[+1]補(bǔ)=0000 0001 [-1]補(bǔ)=1111 1111
[+127]補(bǔ)=0111 1111 [-127]補(bǔ)=1000 0001
[+45]補(bǔ)=0010 1101 [-45]補(bǔ)=1101 0011
在看補(bǔ)碼計(jì)算的問題:
1+(-1)=0 |(0000 0001)補(bǔ)+(1111 1111)補(bǔ)=(0000 0000)補(bǔ)=(0000 0000)原=【0】 可以看到暑劝,沒有問題骆莹。
1+(-2)=-1 |(0000 0001)補(bǔ)+(1111 1110)補(bǔ)=(1111 1111)補(bǔ)=(1000 0001)原=【-1】可以看到,沒有問題担猛。
-1+(2)=1 |(1111 1111)補(bǔ)+(0000 0010)補(bǔ)=(0000 0001)補(bǔ) =(0000 0001)原=【1】 可以看到幕垦,沒有問題。
通過(guò)上面的計(jì)算傅联,我們發(fā)現(xiàn)先改,用補(bǔ)碼的方式,就不存在在原碼和反碼中存在的計(jì)算問題了蒸走。其實(shí)仇奶,這也是計(jì)算機(jī)表達(dá)帶符號(hào)整數(shù)用補(bǔ)碼的原因。補(bǔ)碼一定是不會(huì)存在原碼和反碼的問題的比驻。
討論下原碼反碼補(bǔ)碼的原理该溯,沒興趣的可以跳過(guò) 岛抄。
-
為什么原碼不行?
( 1 )10- ( 1 )10 = ( 1 )10 + ( -1 )10 =( 0 )10
(00000001)原+ (10000001)原 = (10000010)原 = ( -2 ) 顯然不正確狈茉。
通過(guò)上面原碼計(jì)算式可以看出弦撩,當(dāng)正數(shù)加上負(fù)數(shù)時(shí),結(jié)果本應(yīng)是正值论皆,得到的卻是負(fù)值(當(dāng)然也有可能得到的是正數(shù)益楼,因?yàn)楸粶p數(shù)與減數(shù)相加數(shù)值超過(guò)0111 1111,即127点晴,就會(huì)進(jìn)位感凤,從而進(jìn)位使符號(hào)位加1變?yōu)?了,這時(shí)結(jié)果就是正的了)粒督。而且數(shù)值部分還是被減數(shù)與減數(shù)的和陪竿。并且,當(dāng)負(fù)數(shù)加上負(fù)數(shù)時(shí)(這里就拿兩個(gè)數(shù)值部分加起來(lái)不超過(guò)0111 1111的來(lái)說(shuō)),我們可以明顯看出符號(hào)位相加變?yōu)?,進(jìn)位1被溢出萝快。結(jié)果就是正數(shù)了洪己。因此原碼的錯(cuò)誤顯而易見,是不能用在計(jì)算機(jī)中的睹逃。 -
補(bǔ)碼的原理
既然原碼并不能表示負(fù)數(shù)的運(yùn)算問題,那么當(dāng)然要另想他法了。這個(gè)方法就是補(bǔ)碼桐绒,不得不說(shuō),這是一個(gè)最簡(jiǎn)潔的方法之拨,當(dāng)然茉继,也可以用別的更復(fù)雜的方法,那就不是我們想要的了蚀乔。我自己研究補(bǔ)碼的時(shí)候烁竭,也在網(wǎng)上找了些資料,都是到處copy吉挣,反正我是看的迷糊了派撕,本人數(shù)學(xué)功底不怎么樣,看不懂那些大神寫的听想,只好腥刹,自己理解了下。要談補(bǔ)碼汉买,先看看補(bǔ)數(shù)的問題衔峰。什么是補(bǔ)數(shù),舉個(gè)簡(jiǎn)單的例子,100=25+75垫卤。100用數(shù)學(xué)來(lái)說(shuō)就是模M威彰,那么就可以這樣概括。在M=100的情況下穴肘,25是75的補(bǔ)數(shù)歇盼。這就是補(bǔ)數(shù)。25是75的補(bǔ)數(shù)评抚,這是在常規(guī)世界中豹缀,在計(jì)算機(jī)上就不是這樣了,因?yàn)榭谟?jì)算機(jī)中邢笙,數(shù)據(jù)存在溢出的問題。假設(shè)機(jī)器字長(zhǎng)是8的話侍匙,那么能表達(dá)的最大無(wú)符號(hào)數(shù)就是1111 1111氮惯,在加1的話,就變成1 0000 0000 想暗,此時(shí)因?yàn)橐绯龈竞梗?去掉,就變成0了说莫,
也就是說(shuō)杨箭,在計(jì)算機(jī)中,補(bǔ)數(shù)的概念稍微不同于數(shù)學(xué)之中唬滑,25+75=100告唆,考慮計(jì)算機(jī)中的溢出問題,那么25+75就等于0了晶密。也就是說(shuō),25和75不是互為補(bǔ)數(shù)了模她。我覺得用鬧鐘來(lái)比喻這個(gè)問題再形象不過(guò)了稻艰,因?yàn)?strong>鬧鐘也存在著溢出的問題,當(dāng)時(shí)間到達(dá)11:59 侈净,在加1分鐘的話就變成0:0了尊勿,這和計(jì)算機(jī)的溢出是同一個(gè)道理。那么畜侦,有一個(gè)時(shí)鐘元扔,現(xiàn)在是0點(diǎn),我想調(diào)到5點(diǎn)旋膳,有兩種方法澎语,一個(gè)是正著撥5,到5點(diǎn)。第二種方法是倒著撥7擅羞,也可以到5點(diǎn)尸变。正著撥5記作+5,倒著撥7减俏,記作-7召烂,而鬧鐘的M是12,也就是說(shuō)娃承,在考慮溢出的情況下奏夫,M=12,5是-7的補(bǔ)數(shù)历筝。用個(gè)數(shù)學(xué)等式可以這樣表0+5=0+-7酗昼,即0+5=0-7,這就是計(jì)算機(jī)中的數(shù)值計(jì)算和數(shù)學(xué)中的計(jì)算不同的地方漫谷。
明白了計(jì)算機(jī)中補(bǔ)數(shù)的道理仔雷,那么就明白補(bǔ)碼的問題了。還是用例子說(shuō)明:
在計(jì)算機(jī)中計(jì)算十進(jìn)制 1+(-2)舔示。
1的原碼是:0000 0001
-2的原碼是:1000 0010
-2的補(bǔ)碼是:1111 1110 這個(gè)二進(jìn)制換做無(wú)符號(hào)的整數(shù)大小就是254碟婆,而8位二進(jìn)制數(shù)的M=28=256。(很多文章中把M寫成27惕稻,這根本就是不對(duì)的竖共,根本沒有解決符號(hào)位的問題)你發(fā)現(xiàn)什么了沒?當(dāng)換成補(bǔ)碼后俺祠,-2和254就是補(bǔ)數(shù)的關(guān)系公给。也就是1+(-2)等價(jià)于了1+254了。這樣做蜘渣,好處在什么地方淌铐,你自己都可以看得到:
1):利用補(bǔ)數(shù)和溢出的原理,減法變成了加法蔫缸。
2):符號(hào)位不在是約束計(jì)算的問題腿准,不會(huì)存在原碼中的問題了,因?yàn)樽兂裳a(bǔ)碼后拾碌,雖然最高位依然是1吐葱,但是這個(gè)1就不在是做為符號(hào)位了,而是作為一個(gè)普通的二進(jìn)制位校翔,參與運(yùn)算了弟跑。
所以,這就是補(bǔ)碼的原理所在防症,通過(guò)補(bǔ)數(shù)和溢出孟辑,解決了減法和負(fù)數(shù)問題哎甲。 -
十進(jìn)制數(shù)求補(bǔ)碼,補(bǔ)碼求十進(jìn)制數(shù)
十進(jìn)制求補(bǔ)碼:
如果是正數(shù)扑浸,直接求它的原碼烧给,符號(hào)位為0
如果是負(fù)數(shù),比較好的方法是先求十六進(jìn)制喝噪,在由十六進(jìn)制求二進(jìn)制础嫡,符號(hào)位為1,在除了符號(hào)位都取反酝惧,在加1榴鼎,即可得到補(bǔ)碼。
補(bǔ)碼就十進(jìn)制 :
根據(jù)符號(hào)位判斷晚唇,如果符號(hào)位是0巫财,表示是正數(shù),就是原碼哩陕,直接轉(zhuǎn)換就十進(jìn)制即可平项。
如果符號(hào)為是1,表示是負(fù)數(shù)悍及。那么闽瓢,連符號(hào)位在內(nèi)都取反,在加1心赶,將該二進(jìn)制轉(zhuǎn)換為十進(jìn)制扣讼,該十進(jìn)制數(shù)即使該負(fù)數(shù)的絕對(duì)值,加個(gè)負(fù)號(hào)-缨叫,就得到該負(fù)數(shù)椭符。
存儲(chǔ)帶小數(shù)點(diǎn)的數(shù):
這個(gè)看了很多,還是迷糊耻姥,書讀的少销钝,只是知道是通過(guò)浮點(diǎn)解決的,我就放兩個(gè)鏈接吧琐簇,感興趣的自己去研究曙搬。
計(jì)算機(jī)內(nèi)存中浮點(diǎn)數(shù)的表示
小數(shù)在計(jì)算機(jī)中的存儲(chǔ)形式存儲(chǔ)字符:主要通過(guò)字符編碼來(lái)解決,這也是我們要解決的問題鸽嫂。受限于篇幅,我把字符編碼剩下的部分放到第二篇文章來(lái)講了征讲。