問題的**是我同學在資料結構群裡提出的乙個問題
這裡看到,最大值加了10,反而小於最大值。
接著我們嘗試輸出一下這個值是多少:
發現這個數字和最小值正好差了9
於是我又嘗試了一下+1
恰好是最小值!!!
之前我只知道溢位的話會出現很奇怪的數字,但是從來沒有認真研究過這個問題,而且關於編碼補碼之類的知識上課並沒有認真聽,於是又去重新回爐學習了一下,發現了原因
int型長度是4個位元組,每位元組有8位,也就是一共32位
第一位是符號位,0表示正數,1表示負數,剩下31位是數值位
對於這些編碼,在計算機中都是由補碼儲存的,正數的補碼是其本身,負數的補碼是它的反碼再加1
ps:反碼,把編碼除符號位以外取反
所以這裡就會出現乙個問題,就是0這個數,因為正數和負數的補碼規則不同,正0和負0就會出現兩個補碼,這顯然有問題
所以人為規定0是按照正數的編碼規則,那麼對於原來負0的補碼,就沒有任何數的補碼可以變成它,所以也進行人為規定,讓它成為最小值,這也是最小值的絕對值比最大值的絕對值大一的原因。
我們重新來看一下那個題:
對於最大值,它的編碼是01111111111111111111111111111111
當它加一就變成10000000000000000000000000000000
由於符號位是1,系統就認為它是負數,其實也就是我們原來提到的的最小值
所以加10的時候也是這個道理,因為溢位之後符號位變成1,反而成為了負數,當然就比最大值小了。
由Python位運算到原碼反碼補碼
採用書籍python核心程式設計 第二版 人民郵電出版社,2008年7月第1版。本書以python2.5為主,但筆記主要以python3.6為主。python支援標準位運算,位運算操作符只能用於整數。操作符如下 操作符意義 舉例操作符 意義舉例 按位取反 5 按位與5 6 按位或 5 6 按位異或 ...
帶符號數的編碼 原碼 反碼 補碼
為什麼要引入帶符號數 在數制轉換中整數和小數部分不太一樣,類似的,正負數編碼方式不同,所以需要規定帶符號數 signed binary numbers 編碼規則 最高位為符號位,0為正,1為負,其餘位為數值位 範圍 二進位制正負數的一般定點 浮點有其他方法 方法 原碼反碼補碼在符號位是相同的 正數的...
簡析二進位制補碼原理 補碼 反碼 1?
在計算機系統中,規定數值一律用補碼來表示和儲存。因為使用補碼可以將符號位和數值域統一處理 同時,加法和減法也可以統一處理。很多人很好奇為什麼要使用補碼表示和儲存?直接使用原碼表示多好,看上去更加直觀和易於計算。那麼,為什麼計算機使用補碼比原碼更好,又是如何通過補碼來計算數值的呢?這其中的原理是什麼?...