很多朋友對于補碼運算符號位參與運算嗎和位運算是按照補碼來的嗎不太懂,今天就由小編來為大家分享,希望可以幫助到大家,下面一起來看看吧!
計算機為什么采用補碼來進行運算
采用補碼運算具有如下兩個特征:1)因為使用補碼可以將符號位和其他位統一處理,同時,減法也可以按加法來處理,即如果是補碼表示的數,不管是加減法都直接用加法運算即可實現。
2)兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄。
這樣的運算有兩個好處:1)使符號位能與有效值部分一起參加運算,從而簡化運算規則。
從而可以簡化運算器的結構,提高運算速度;(減法運算可以用加法運算表示出來。
)2)加法運算比減法運算更易于實現。
使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計。
補碼范圍
八位二進制正數的補碼范圍是00000000~01111111即0~127,負數的補碼范圍是正數的原碼00000000~01111111取反加一(也可以理解為負數10000000~11111111化為反碼末尾再加一)。
所以得到100000000~10000001,10000001作為補碼,其原碼是11111111(-127),依次往前推,可得到-1的補碼為11111111,那么補碼00000000的原碼是10000000符號位同時也可以看做數字位即表示-128,這也解釋了為什么127(01111111)+1(00000001)=-128(10000000)。
在計算機中數據用補碼表示,利用補碼統一了符號位與數值位的運算,同時解決了+0、-0問題,將空出來的二進制原碼10000000表示為-128,這也符合自身邏輯意義的完整性。因此八位二進制數表示范圍為-128~+127。
為什么有符號乘法結果取補碼
丟開教科書式的概念,想想為什么要有補碼這個東西,為什么符號位會產生。
定義:
原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進制形式表示。
機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,并在未位加1而得到的。
如果是為了考試,死記即可。但我總想搞清楚為什么計算機里面的數要這樣子表達?意義何在?-128的補碼為什么是10000000?為什么補碼有這么奇怪的運算規則?計算機算減法的時候都需要從源碼到補碼的計算嗎?
思路
計算機里面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行。
用補數代替原數,可把減法轉變為加法。出現的進位就是模,此時的進位,就應該忽略不計。
二進制下,有多少位數參加運算,模就是在1的后面加上多少個0。
補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。
補充解釋一下“模”的概念,可以參照離散數學里面的環:
考慮時鐘上時間的計算,假設現在時針指向數字3,若問“6小時前時針指向的數字是幾”,則可以:
1.將時針逆時針撥動6格。
2.將時針順時針撥動12-6=6格。
兩者的結果是一樣的。這里稱12為“模”。
故有3時-6個小時=3時+(12-6個小時),這里可以看到將減法轉換成加法的過程,即“加上模減去絕對值的差”。
所以,假設模是10,有效位數為1,當我們計算9-7的時候:
9-7=>9+(10-7)=12,去掉最高的位后,得到2,這是正確的結果。
作者的意思是說,計算機里面所有數都以補碼形式保存,加減運算都是補碼之間的加法運算。然后作者提出了一個我之前沒聽過的觀點:
補數和補碼的定義式里面,根本就沒有什么符號位。這最高位的1、0是自然出現的,并不是由人來規定的。
的確,符號位在補碼運算里面是“模”,本身并不帶符號的意義。因為計算機將加法轉換成加上一個“負數”,而負數又以補碼的形式表現。補碼比源碼多一位,從這多出來的一位可以推斷出原來數字的正負號,所以成為了符號位。也可
為什么計算機中帶符號數采用補碼表示
丟開教科書式的概念,想想為什么要有補碼這個東西,為什么符號位會產生。定義:
原碼表示法是機器數的一種簡單的表示法。其符號位用0表示正號,用:表示負號,數值一般用二進制形式表示。
機器數的反碼可由原碼得到。如果機器數是正數,則該機器數的反碼與原碼一樣;如果機器數是負數,則該機器數的反碼是對它的原碼(符號位除外)各位取反而得到的。
機器數的補碼可由原碼得到。如果機器數是正數,則該機器數的補碼與原碼一樣;如果機器數是負數,則該機器數的補碼是對它的原碼(除符號位外)各位取反,并在未位加1而得到的。
如果是為了考試,死記即可。但我總想搞清楚為什么計算機里面的數要這樣子表達?意義何在?-128的補碼為什么是10000000?為什么補碼有這么奇怪的運算規則?計算機算減法的時候都需要從源碼到補碼的計算嗎?
思路計算機里面,只有加法器,沒有減法器,所有的減法運算,都必須用加法進行。
用補數代替原數,可把減法轉變為加法。出現的進位就是模,此時的進位,就應該忽略不計。
二進制下,有多少位數參加運算,模就是在1的后面加上多少個0。
補碼就是按照這個要求來定義的:正數不變,負數即用模減去絕對值。
補充解釋一下“模”的概念,可以參照離散數學里面的環:考慮時鐘上時間的計算,假設現在時針指向數字3,若問“6小時前時針指向的數字是幾”,則可以:1.將時針逆時針撥動6格。2.將時針順時針撥動12-6=6格。兩者的結果是一樣的。這里稱12為“模”。故有3時-6個小時=3時+(12-6個小時),這里可以看到將減法轉換成加法的過程,即“加上模減去絕對值的差”。所以,假設模是10,有效位數為1,當我們計算9-7的時候:9-7=>9+(10-7)=12,去掉最高的位后,得到2,這是正確的結果。作者的意思是說,計算機里面所有數都以補碼形式保存,加減運算都是補碼之間的加法運算。然后作者提出了一個我之前沒聽過的觀點:
補數和補碼的定義式里面,根本就沒有什么符號位。這最高位的1、0是自然出現的,并不是由人來規定的。
的確,符號位在補碼運算里面是“模”,本身并不帶符號的意義。因為計算機將加法轉換成加上一個“負數”,而負數又以補碼的形式表現。補碼比源碼多一位,從這多出來的一位可以推斷出原來數字的正負號,所以成為了符號位。也可以這樣認為,留出一位(不全部占滿)的原因是要用“模”來表示正負數。
也就是說,不是特意留出一個符號位,用1和0來表示正負號。而是補碼運算可以用最高位來表示正負,所以符號位誕生了。
那么為什么-128的補碼是10000000?可以這樣理解。-128是一個負數,所以它的補碼是它的“模”減去它的絕對值,即:
那么為什么負數補碼等于源碼的反碼加一呢?可以這樣推導:
由此我們得知,在計算機里面所有的數字都以補碼形式存儲。127存成01111111,-127存成11111111,算減法就變成算加法了,盡管你看到的是“-”號。
補碼運算符號位自然丟失是什么意思
符號位也參與運算,如有溢出,則溢出部分丟失。也就是不考慮溢出的情況。
補碼運算符號位參與運算嗎的介紹就聊到這里吧,感謝你花時間閱讀本站內容,更多關于位運算是按照補碼來的嗎、補碼運算符號位參與運算嗎的信息別忘了在本站進行查找哦。