回覆列表
  • 1 # 程式設計老大叔

    想要知道計算機怎麼進行數字運算,就需要了解計算機的儲存原理。

    大家都知道計算機只認識0和1,但是0和1對人又不友好,怎麼做到這兩者的轉換呢?這就需要從計算機的儲存講起。

    位和位元組

    位:來自英文bit,音譯為“位元”,表示二進位制位。位是計算機內部資料儲存的最小單位,11010100是一個8位二進位制數。

    位元組:來自英文Byte,音譯為“拜特”,習慣上用大寫的“B”表示。位元組是計算機中資料處理的基本單位。計算機中以位元組為單位儲存和解釋資訊,規定一個位元組由八個二進位制位構成,即1個位元組等於8個位元(1Byte=8bit)。八位二進位制數最小為00000000,最大為11111111;通常1個位元組可以存入一個ASCII碼,2個位元組可以存放一個漢字國標碼。

    unsigned int、signed int和unsinged char 、signed char

    一般來說char型別變數在計算機記憶體裡佔用1個位元組,也就是8個位元(byte),unsinged就是無符號的意思,signed就是有符號的意思。char預設是unsinged型別

    如果是unsinged char那麼最高位(最左邊)就可以用來表示數字,那麼char能表示的範圍是二進位制的00000000~11111111,轉換為十進位制就是0~255。

    如果是signed char那麼最高位(最左邊)就需要用來表示正負0為正,1為負,那麼只有剩餘7位能表示數字,所以能表示的範圍就是1111 1111~01111111 ,轉換位十進位制就是 - 127~ +127。還有一個 1000 0000 用它來表示 -128,因為沒有負0的概念。計算機裡負數都是用補碼來表示。關於補碼的概念後面會講。

    unsigned int和signed int在char的基礎上理解,只不過int是四個位元組,也就是4*8=32位。int預設是signed有符號位的。所以,unsigned int表示的範圍是:0~2的32次方-1。signed int表示的範圍是:-2的31次方~2的31次方-1。

    原碼、反碼、補碼

    要了解清楚原碼、反碼、補碼需要先了解兩個額外的概念:機器數和真值

    機器數:一個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的比如,十進位制中的數 +3 ,計算機字長為8位,轉換成二進位制就是00000011。如果是 -3 ,就是 10000011 。這裡的 00000011 和 10000011 就是機器數。

    真值:拿上面的機器數00000011(十進位制+3)來講,其形式值131(又二進位制轉10進製得來),但是實際我們要的是+3,所以我們需要去掉最高位符號位:0000 0001的真值 = +000 0011 = +3,1000 0001的真值 = –000 0011 = –3。

    瞭解來上面兩個概念,我們就可以來看原碼、反碼、補碼了

    原碼:顧名思義,原碼就是我原來要表示的值的二進位制碼,所以+3/-3的原碼是需要考慮符號位的:+3的原碼是:0000 0011。-3的原碼是:1000 0011。

    反碼:

    正數的反碼是其本身

    負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反

    +3 原碼是:0000 0011 反碼是:0000 0011

    -3 原碼是:1000 0011 反碼是:1111 1100

    補碼:

    正數的補碼就是其本身

    即在反碼的基礎上+1

    +3 原碼是:0000 0011 反碼是:0000 0011 補碼是:0000 0011

    -3 原碼是:1000 0011 反碼是:1111 1100 補碼是:1111 1101

    為什麼要存在這麼多碼

    看完上面的內容,大家一定很懵,為什麼要弄這麼多碼。這是因為計算機是不辨別"符號位",因為這顯然會讓計算機的基礎電路設計變得十分複雜! 於是人們想出了將符號位也參與運算的方法。我們知道, 根據運演算法則減去一個正數等於加上一個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了。

    在加減乘除中,正數當然很好處理,如果遇到負數就會有問題,我們來看一下-3-(-3)如果用原碼運算會怎麼樣:

    在計算機中只有加法,所以-3-(-3) =3+(-3);

    0000 0011+1000 0011=10000110,我們算上符號轉為十進位制是:-6;

    既然原碼不行,那用反碼?好,試一下看看

    0000 0011+1111 1100 = 111111111,我們算上符號轉為十進位制是:-127;

    那再試試補碼

    0000 0011+1111 1101 = 00000000;我們算上符號轉為十進位制是:0;

    OK,是對的;

    總結

    所以計算機運算是以補碼運算的,並且計算機只有加法,兩個負數相減最終會透過加法與數字本身的正負來實現

  • 中秋節和大豐收的關聯?
  • 形容白茶的優美句子?