基本类型理解巩固及补码原理总结
引言
本篇文章屬于計算機基礎通識,主要討論:有符號類型、無符號類型的區別,byte、int 等類型的取值范圍,最大值最小值的計算公式的由來,原碼、反碼、補碼轉換公式。
有符號類型與無符號類型
在 Java 中的八大基本類型:byte、short、int、long、float、double、boolean、char 中,前六個為有符號類型。
| byte | boolean |
| short | char |
| int | ? |
| long | ? |
| float | ? |
| double | ? |
所謂有符號類型,指的是這種類型本身可以表示負數和正數。注意與整數相互區分。
有符號類型都遵從相同的數值表示規則,即最高位表示符號位。下面以 byte 為例進行講解。
byte 類型的取值范圍
我們知道,byte 類型只表示一個字節,那么它究竟是如何表示正數和負數的呢?
對于有符號類型,我們會將 byte 的 8 位分成兩部分——符號位和數值位:
那么byte 的取值范圍就是 -2^7 ~ (2^7 -?1),即 -128 ~ 127。
為什么?
首先我們知道:進制、位數和取值范圍是乘方的關系。底數代表進制,指數代表位數,所得結果就表示取值數量(地址空間)。如下圖所示:
對于正數,取值范圍表示的是能夠表示的數字的個數,是包含 0 的,就好像數組中長度與最后一個數的索引值,最大值也需要進行減 1 處理,因此最大值就是 2^7 - 1,即 127。
對于負數,符號位用 1 表示,然而如此一來就會出現 -0 和 0 這兩個奇怪的數,于是人為規定 1 000 0000 表示 byte 類型范圍內的最小值。此時,負數表示的情況下,7 位數值的全部取值都表示一個對應的負數,而正數要去掉 1 個 全 0 的值用來表示數字 0,因此很明顯負數要比正數多 1 個數。即 負數可以有 2^7 個,于是最小的數就是 -2^7 ,即 -128。
原碼、反碼、補碼
原碼,反碼,補碼的產生過程,就是為了解決,計算機做減法和引入符號位(正號和負號)的問題。
原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其余位表示數值的大小。一般情況下,原碼就單獨處理符號位的一種表示方式,如 -5的8位原碼是:1000 0101;-3 的 8位原碼是 1000 0011;8 的原碼是 0000 1000。注意,如果某個負數取絕對值后超出位數所能表示的最大值,比如 -128 ,取模后是128 超出了 byte 類型的表示最大值 127,那么 -128 就沒有原碼。
反碼是原碼除符號位之外的按位取反。如 -5 的 8 為反碼是 1111 1010;-3 的反碼是 1111 1100 ;8的反碼是 0111 0111。
在計算機系統中,數值一律用補碼來表示和存儲。
原因在于,原碼雖然簡單直觀,但是計算的時候需要特別將符號位和數值位區分處理,這無形增加了硬件的開銷和復雜性,而使用補碼,可以將符號位和數值位統一處理。
上面部分提到了有符號數的取值范圍,它們包含了許多負數,然而,如果單從表面上觀察,很難將一個負數與其計算機內部的二進制表現形式聯系起來,比如:byte 類型的 -128,它在計算機內部的表示是:1000 0000;-125 對應??1000 0011? 。
那么我們就需要了解原碼、反碼、補碼的轉換規則才能快速完成 編碼的轉化。
首先,對于正數來說,人為規定:原碼、反碼、補碼完全一樣。除了高位為 0 以外,剩余的 數值位,可以快速通過 2進制與 16進制的轉化規則確定,比如 byte 類型的 125 ,十六進制是:7D,那么原碼、反碼、補碼都是 ?0111 1101? 。
對于負數,補碼(計算機中實際表示的編碼)的計算規則為:原碼取反再加一。
另外,補碼到原碼的轉換也可以通過 先取反,再加一的方式得到,不需要先減一再取反,這樣的特性降低了電路邏輯的復雜性,也是補碼流行起來的原因。
short、int 等有符號類型的類推
short 、 int 等其他有符號類型的值,除了字節數不同、位數較多以外,其他所有的規律都是類似的。
如int 類型,它在計算機中以 4 個字節表示,總共32 位,最高位也同樣表示 正負,那么數值位總共就有 31 位,那么 int 的表示范圍就是 : -2^31 ~ (2^31 - 1)。推理方式和 前面 byte 是完全一樣的。
總之,一定要記住,在計算機中,所有負數 都是由補碼來表示的,而正數 直接用原碼表示(但實際上也是補碼,只不過規定正數的補碼、反碼和 原碼要完全一致)。
總結
以上是生活随笔為你收集整理的基本类型理解巩固及补码原理总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 史上最真实行业鄙视链
- 下一篇: JVM007_运行时栈帧结构