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