计算机基础知识:原码、反码、补码
可能很多人有這樣的疑問,我們為什么要了解原碼、反碼、補碼,它能幫助我們解決什么問題?在編寫代碼中有什么實際用途呢?
我是這樣認為的,其一,作為計算機基礎知識,我們必須有所了解。其二、這些基礎知識無論是普通的編寫代碼,還是研究高超的算法都離不開它。
例:我們常見的位運算 ?按位與(&)、按位或(|)、取反(~)等等。
? ? ? ?在代碼中, 我們可能經常會碰到這樣的需求,要計算一個數是偶數或奇數,一般我們這樣寫 ?n % 2 取余,如果余0則為偶,否則為奇。
? ? ? ?我們可以利用按位與(&)很巧妙的解決這問題,而且效率會更高,因為位運算是對內存數據進行操作,不需要轉換成十進制,因此它的處理速度更快。
? ? ? ?我們來判斷整數n是奇是偶,可以運用表達示 n & 1,如 n = 5, n & 1返回值1; ? 如n=6,n&1返回值0;因為,在二進制里面,末位為0表示偶數,為1表示奇數,效果與n % 2 取余是一樣的,但比它要快。
當然,除了這個,還有非常多的用途。
好啦,我們進入正題!
------------------------------------------------------------------------------------------------------------------------------------------------
我們知道,計算機中所有數據最終都是以二進制數表示。
相信大家也學過如何將一個十進制數轉換為二進制數,如果覺得換算比較麻煩,可以用系統自帶的計算器輔助換算。
我們也學過字節與位,1字節=8位,通常在Asp.net、Java等高級編程語言中int類型默認以32位(4字節)表示,當然你可以顯示申明以16位或64位表示。現假設有int類型數,值為9,在計算機中以二進制方式表示如下:
--8位--
0000 1001
--16位--
0000 0000 0000 1001
--32位--
0000 0000 0000 0000 0000 0000 0000 1001
--64位--
0000?0000 0000 0000?0000 0000 0000 0000 0000?0000 0000 0000?0000 0000 0000 1001
通過以上可以看出,數值9轉換成二進制是0000 1001,在16位、32位或64位中它們占位比較多,所以前面補0填充。
OK,這是數值9的二進制表述,那么如果是-9,它在計算中如何表述呢?
在計算機中,負數是以其正值的補碼形式表述的。這就需要我們搞清楚什么是原碼、反碼、補碼,他們之間有什么曖昧的關系啦。
原碼:一個整數,按照絕對值換算成的二進制數,稱為原碼。(數的絕對值:正數和零的絕對值是它本身,負數的絕對值是它的相反數。總之,一個數的絕對值是非負數。)
如:數值-9的絕對值為9,數值9的二進制是 0000 1001,這就是-9的原碼。
反碼:在原碼基礎上按位取反,產生的新二進制數稱為原二進制數的反碼。簡單理解就是:原為1的變成0,原為0的變成1.
如:數值-9的原碼是 0000 1001。把它的每一位取反后為 1111 0110
補碼:反碼加1為補碼。(補碼=反碼+1; 反碼=原碼取反; 原碼=數值絕對值的二進數數)
? ? ? ??如:數值-9的原碼是 0000 1001。把它的每一位取反后為 1111 0110,計算補碼=反碼+1,也就是?1111 0110 + 1 = 1111 0111
?
因此,數值-9在計算機中二進制表述為:1111 0111
我們再來一例:-15在計算機中如何表述:
1、原碼,數值-15的絕對值15,它的二進制表述是 0000 1111
2、反碼,原碼基礎上取反為: ?1111 0000
3、補碼,反碼+1得補碼, ?1111 0001
所以-15在計算機里用二進制表述就是 1111 0001
轉載于:https://www.cnblogs.com/event/p/6406293.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的计算机基础知识:原码、反码、补码的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: SQL Server查询正在执行的存储过
- 下一篇: hexo github pages 搭建