@(組成原理)
在總結原碼,反碼,補碼的表示範圍時,忽略了對移碼的總結,現在看移碼本身的表示範圍與ieee754使用的特殊階碼,有點迷惑,思考後才明白,這其中的關節。
首先我們明白移碼與補碼有相同的表達能力。也就是說,給定相同的機器字長,它們的表達範圍相同。
比如,8位機器字長,都用1位表達正負。
則補碼的表示範圍:[−
27,+
27−1
]=[−
128,
+127]
移碼的表示範圍:[−
27,+
27−1
]=[−
128,
+127]
二者相同。
如果換一種說法,n位階碼,等同於n位機器字長。也需要用一位表示正負。
移碼只用於表示整數。2n
,這個n是資料位,即機器字長去掉乙個符號位。
表達範圍[−
2n,+
2n−1
],機器
字長n+
1位
值得關注的特點是:
特別思考最後一條。對於正數,因為符號位都是0,現在2n
(第n+
1位是符
號位,恰
恰是2n
) 加過來,則最高位變1,於是移碼大,真值就大。
對於負數,我們以3位資料位1位符號位來看。
表達範圍是:[-8,7].
補碼–移碼: −8
=1,000補→
+23=
0,000移−7
=1,001補→
+23=
0,001移−6
=1,010補→
+23=
0,010移−5
=1,011補→
+23=
0,011移−4
=1,100補→
+23=
0,100移−3
=1,101補→
+23=
0,101移−2
=1,110補→
+23=
0,110移−1
=1,111補→
+23=
0,111移
可見通過移碼的表示法,能夠更清晰的去把握補碼的負數表示形式。
移碼是非常自然的,從全0開始到全1,主觀上與我們的直覺一致,但是表示範圍與補碼相同。
主要看ieee754編碼下,有8位移碼.
若是單純的用原本移碼的定義,表示範圍是[−
27,2
7−1]
=[−128
,127
] .
但是實際上是[−
126,
127]
。為了空兩個狀態表達非規格化數和無窮大,去掉了00000000(8個0),11111111(8個1).
注意,這裡的狀態是移碼狀態。所以移碼最大的狀態表示式是
11111110b=
254 ,最小是
00000001=1
.普通情況是真值加上偏置值求得移碼表示,現在是已知移碼表示求真值。偏置值取啥合適?若按正常取27
=128
,那麼最大真值就變成
254−
128=
126 ,最小真值變成1−
128=
−127
。也就是左右各收縮乙個真值。我們想想看,是為了多表達更多的大正數重要,還是表達乙個極小的小數重要?更大的正數對吧!所以,偏置值往左挪一位,不能挪2位更不能3位,只用挪乙個就可以表達移碼本身能表示的最大正數127了。
所以,偏置值取的是127.
所以ieee754單精度可以取得的階碼範圍是[−
126,
127]
,也即負數收縮了兩個,正數不變。
同理,對於雙精度的ieee754編碼,也是同樣的分析,階碼的真值範圍是[-1022,1023]。
再聯想到ieee754編碼的尾數隱藏了乙個資料位,所以尾數至少是1,且用原碼表示,所以就很容易知道所有ieee754相關的數值範圍問題了。
ieee754:
比如,最小正值分別是:
1.0×2−
126,
1.0×2−
1022
最大正值分別是:(2
−2−23
)×2127,(
2−2−
52)×2
1023
普通的移碼階碼就按照正常的分析即可,即偏置值取2n
,n是數
據位數目
。
中斷和異常的再總結
os 內部異常 內中斷 外中斷 來自cpu執行指令以外的事件。如 i o中斷,時鐘中斷等。在作業系統層次上,我們多聽到 異常 exception 而少見 中斷 interrupt 且往往籠統地稱其為異常,但處理器微體系結構規範通常會區分中斷和異常。一般而言,中斷是非同步的,異常是同步的,所謂同步和非...
中斷和異常的再總結
中斷和異常的再總結 os 內部異常 內中斷 故障 fault 自陷 trap 終止 abort 是源自cpu執行指令內部的事件。如 非法操作碼,位址越界,算術溢位,虛存系統的缺頁,陷入指令等引起的事件。內部異常不可被遮蔽,一旦出現立馬處理。外中斷 來自cpu執行指令以外的事件。如 i o中斷,時鐘中...
java再複習 異常總結
異常體系 throwable頂層介面 error 錯誤體系,發生這種錯誤,代表發生了不可挽回的錯誤,jvm會直接停止執行,並不提供任何可處理機制,只列印相關錯誤資訊。exception 異常體系,發生這種異常,相當於生病,有的可處理,有的不可處理,但是都是只是 病 沒有致命的問題,可以解決。runt...