整數的表示方式精解
這一屆比較重要,不對,
是很重要
.上一次我們說了布林代數以及
c語言的位運算.
c語言中的整數型別以及範圍 以c
語言為例
,c語言當中提供了多種整數型別
,一共始終
,位數為
1,2,4,8,
其中32
位機器上
,4位的有兩種
,64位的機器上
,8位的有兩種
.下面是32位
os上,這十種整數的範圍:
32位的系統不常見了
,來看一下64位
os上的範圍:
說實話,
差不多,
你不用背過.
上述是c
語言中各個整數型別的表示範圍,不過
c語言有他的最小數值範圍
,也就是說
c語言要求這些資料型別至少要滿足乙個標準的範圍
.下圖是
c語言對整數型別要求的最小表示範圍:
仔細看的話,
可以發現
,c語言只要求有符號數的範圍是對稱的
,另外就是
int和
long
型別的位數要求都比較低
,分別是2位和
4位.
無符號編碼
你可看到以上的表中,
每一種整數型別都可以加上
unsigned
關鍵字,
來表示乙個乙個無符號數
,即沒有正負之分
.在書中
,給出了無符號數的定義
,對於乙個
w位的二進位制來說
,它的無符號表示為以下形式:
對於乙個無符號編碼來說,
他的最大值和最小值很好確定
,對於乙個
w位的二進位制序列來說
,當所有位都為0時
,則為最小值,即
: uminw = 0
當所有位都為1時,
則為最大值
,根據等比數列的求和公式,即
:umaxw = 1 * (1-2w) / 1 - 2 = 2w - 1
如果把上述的定義看成是乙個函式的話,
那麼這個函式就是乙個雙射
.就是所
,對於任意整數
x,當0 =
存在唯一的二進位制序列與其對應
.反過來也是一樣的
,對於任意乙個
w位的二進位制序列
,都存在唯一乙個整數
x滿足0 =
無符號編碼屬於相對比較簡單的格式,
因為它符合我們的慣性思維
,上述定義其實就是對二進位制轉換為十進位制的公式而已
,只不過在一向嚴格的數學領域來說
,是要給予明確的含義的
補碼編碼
無符號編碼符合人們的慣性思維是沒錯,
但是可惜的是
,無法表示負整數
.因此我們需要一種能夠表示負數的整數表示方式
,這就是補碼編碼
.與無符號編碼一樣
,書上有定義
,即對於任意乙個
w位的二進位制來說
,它的補碼表示為以下形式:
這裡最高位xw-1為符號位,
當它為1時,
該公式得到的值為負數,當為
0時,得到的則為正數.
我們觀察這個公式,
不難看出
,補碼格式下
,對於乙個
w位的二進位制的序列來說
,當最高位為
1,其餘位全為0時
,得到的就是補碼格式的最小值,即
: tminw = -2w-1
當最高位為0時,,
其餘位全為1時
,得到的就是補碼格式的最大值
,根據等比數列的求和公式,即
: tmaxw = 1 * (1 - 2w-1) / 1 - 2 = 2w-1-1
與無符號編碼一樣,
如果把上述的定義看成是乙個函式的話
,那麼這個函式同樣是乙個雙射
.就是說
,對於任意整數
x,當-2w-1 =
存在唯一的二進位制序列與其對應
.反過來
,對於任意乙個
w位的二進位制序列
,都存在唯一乙個整數
x滿足-2w-1 =
黨對於無符號的編碼來說,
補碼編碼與我們的慣性思維有些不同
,因此直觀的理解起來會有些彆扭
,誰讓我們幹這一行呢
,幹一行愛一行.
兩種編碼的轉換
在c語言中
,我們經常使用強制型別轉換
,之前我也說過強制型別轉換
.強制型別轉換不會改變二進位制序列
,但是會改變資料型別的大小以及解釋方式
,那麼考慮相同型別的無符號編碼和補碼編碼
,資料型別的大小是沒有任何變化
,變化的就是他們的解釋方式.比如
1000
這個二進位制序列
,如果永無符號編碼解釋的話就表示
8,而採用補碼編碼解釋的話
,則表示
-8.
c語言允許有符號與無符號之間的相互轉換。在同是w個
bit表示的基礎上,由於有符號與無符號表示的範圍不同,因此它們之間的轉換與數值意義上的轉換會有不同。規則是
「位不變,值可能變」!
看乙個例子,如用3
個bit
表示的無符號數
5,其編碼為
101,轉換成補碼表示的有符號數的結果為
-3。讓我們看看
-3的補碼表示,正是
101。意即轉換的時候位串是不變的,還是一樣的位串,只不過解釋方式不同,原先是用於解釋為無符號編碼,現在用於解釋為補碼編碼。下面我們看看具體的轉換方式是怎樣的。
首先定義函式u2t
w(x),它把乙個無符號數x
對映成乙個補碼表示的有符號數。如上面的例子有
u2t3
(5)=-3。來看看這個函式的對映關係到底是怎樣的。由於轉換的時候位是不變的,因此我們首先把x
轉成它的無符號編碼表示的
2進製位串x→
=u2b
w(x),其中u2b
w(x)是b2u
w的反函式,作用是把x
對映成它的無符號編碼串。接下來用b2
tw(x
→)就得到了結果,即
。可見,轉換的結果取決於最高有效位是0還是1
,也即x
是小於2
w-1(0)還是不小於2
w-1(1)。於是有
同樣的由補碼表示的有符號數轉換成無符號數的關係為
這是我寫過最操蛋的部落格,沒有之一,弄格式的時候我連吃人的心都有了!!!
演算法精解 快速排序 方式1
前言 快速排序工作原理就是先在序列中找到乙個基準值,我稱為k值。然後小於k的放在k的前面,大於k的放在k的後面。其實我們每操作k一次,就相當於把序列分為兩個部分,一部分大於k,一部分小於k,就這樣周而復始。我們可以推測出平均的時間複雜度為lgn,為啥這樣說呢。但是書本上說的為nlgn,其實他是每次都...
整數的表示
計算機中整數用補碼表示 對於乙個整數 x 的01序列 x x x 3x 2x 1x 0 其 x 的值為 2 x sum limits 2 i x i 例如x的二進位制序列為1001011,x 2 6 2 3 2 1 2 0 53 也就是最高位是負的,其餘都是正的。c語言中位拓展有兩種方法,一種是零拓...
數值資料的表示 整數
定點數的表示 三要素 進製計數制 十進位制,八進位制 定點數的二進位制編碼 原碼,補碼,移碼,反碼 並且 解決了正負號的問題 定點整數的表示 無符號整數,帶符號整數 整數採用進製表示.計算機表示小數點 計算機中只能通過約定小數點的位置來表示小數點 1.小數點位置約定在固定位置的數成為定點數.2.小數...