二進制整數及其表達方式


回去又復習了一遍計算機里面二進制整數的表示方式,主要分為3類:原碼、反碼和補碼。
當然,我還是要在開頭說明一下,計算機里都是以補碼的形式儲存數據。

原碼

這種方式最好理解,將我十進制的“逢十進一”換成二進制的“逢二進一”就行了。
具體如何做呢?還是介紹一下十進制和二進制的轉換方式吧。

  • 二進制轉換十進制

話不多說,直接寫公式,“按權展開求和”:


  • 十進制轉二進制

按照套路來,用"除2取余,逆序排列"的方法。
舉個栗子:789轉換成二進制
1.除二取余

計算 余數 位數
789/2=394 余1 第10位
394/2=197 余0 第9位
197/2=98 余1 第8位
98/2=49 余0 第7位
49/2=24 余1 第6位
24/2=12 余0 第5位
12/2=6 余0 第4位
6/2=3 余0 第3位
3/2=1 余1 第2位
1/2得0 余1 第1位

2.逆序排列余數得到結果
789=1100010101(B)
后面括號里的B代表該數為二進制

  • 計算機里為什么要用二進制碼來表示數據

1、技術實現簡單。計算機是由邏輯電路組成,邏輯電路通常只有兩種狀態,開關的接通和斷開,正好用“0”“1”表示。
2、運算規則簡單,兩個二進制數的和、積運算組合簡單。
3、適合邏輯運算,二進制只有兩個數碼,和邏輯代數中的“真”“假”相吻合。
4、易於進行轉換,二進制和十進制數轉換簡單。
-----------摘自百度知道

對於原碼,我覺得了解上面的就差不多了。

反碼

顧名思義,反碼其實就是把原碼所有的位數反過來,1->0,0->1
這有什么用?為什么要這么做呢?
在此之前,我們先回答以下幾個事實

  • 原碼表示負數很困難
    你可以在電腦的很多地方看到負數運算吧?如果整數在計算機里都用原碼來表示,負數怎么運算呢?這將是一個非常困難的話題。如果要達到這種效果,可能需要在硬件(運算器)的設計時,加入特定的記錄和運算負數的功能,但設計到硬件這方面,問題會變得很麻煩,或者假如它被設計出來,最終應用到電腦上時性能也會大大減弱。引入反碼,就是希望能夠通過另一種編碼形式,解決負數表示的問題。說到這你可能還是很疑問為什么這樣反過來就可以表示負數了,不要急,我來逐步解決你的問題,先繼續往下看。
  • 4個二進制位能表示的最大整數

你可能會覺得1111(B)就是最大的,按照我們之前在原碼里介紹的方法,把它轉化為十進制:
1111(B) = 15
問題來了,如果我們要表示負數呢?所以我們需要抽出一位來表示正負,也就是第一位,並且規定0為正,1為負(其實這也不能說是規定,它很神奇,事實就是這樣)
既然有這個規定,我們能表示的最大整數就不能是255了,而是:
0111(B) = 7
那最小整數呢?是1111(B) = -7嗎,錯誤!繼續往下看,了解如何表示負數。
你可能會比較陌生這樣的表示方法,但現在只要你記住有這樣的規定就行。

  • 如何用反碼表示整數(包括正負數)
    規則:十進制 > 二進制原碼 > 二進制反碼
    將十進制的絕對值轉換為二進制原碼,如果該數為整數,則不變(反碼=原碼),若該數為負數,則按位取反,得到反碼。
    以下列表列出了0附近的幾個反碼(假如我們使用4個二進制位,表示負數一定要確定有多少個二進制位):
二進制反碼 十進制整數
0101 5
0100 4
0011 3
0010 2
0001 1
0000 0
1111 0
1110 -1
1101 -2
1100 -3

從上面到下面,其實大部分還是很好理解的,反碼每次-0001得到下面的數(這和十進制是一樣的),但是我們注意到,有兩個0。我們要討論一下為什么0000-1111得到的還是0,其實仔細想想會發現確實是這樣的,因為0可以看作是+0和-0,按照上面的規則,就有兩種表示方法了。
那0000 - 0001 = 1111又是為什么呢?
這是因為溢出了,你可以理解為0000的前面有無數個1,在后一位不夠的時候會向前一位借1(但是這個1是不會還的)。現在討論溢出還早,這個理解起來有點麻煩。
你現在要知道,如何將十進制數轉化為二進制反碼表示,並且知道0可以有兩種方法表示,就行了。

  • 一個字節表示的最小整數
    觀察二進制反碼的變化,你會發現反碼表示正負數的形式,並不是我們想的那樣:先用原碼表示絕對值,然后前面加一個1或者0讓他變成正或者負。所以這就是為什么之前你認為的“1111(B)是能夠表示的最小整數”這句話是錯的,因為它其實表示的是0。
    那如何得到最小整數呢?
    我們還是看上面列表里的規律吧,繼續往下走,直到反碼的后3位全部0,即1000(B)(第一位我們不能動,因為如果在此繼續減下去,它將變成一個正數!在實際計算機里也是這樣的),我們反向走一遍規則,將1000(B)轉化為絕對值,就是1000(B) > 0111(B) > 7,因為它是負數,所以是-7,這就是4個二進制位能夠表示的最小整數了。
  • 公式法得到反碼
    想要用原碼轉換的方法得到一個數的反碼嗎?這樣會讓轉換過程更加通用。看下面的公式:



    其中n為二進制位數,N為十進制數的絕對值
    假如我們將十進制-6用4個二進制位表示,那么n=4,N=6,公式得到N' = 9,然后用原碼表示9就得到了二進制數:1001,它就是-6的反碼了。


原文地址:https://www.jianshu.com/p/8314710ba093?from=singlemessage


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM