專欄導航
本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。
(一)WIn32 專欄導航
上一篇:計算機基礎:編碼02,有符號數編碼,原碼
回到目錄
下一篇:無
(二)MFC 專欄導航
上一篇:計算機基礎:編碼02,有符號數編碼,原碼
回到目錄
下一篇:無
本節前言
上一節,我講解了原碼的一點知識。本節,我繼續來講解關于原碼的知識。
在上一節,我講了,根據一個原碼,來判斷它所表示的十進制整數。本節,我們反過來,給定一個十進制整數,來求解其原碼。
一.? ? 根據十進制數求原碼
在下面的講解中,會涉及將十進制數轉為對應的二進制數的知識。將十進制整數轉為二進制數,需要采用除 2 取余法。如果你不會這個方法,請參考下面的鏈接所示的文章。
計算機基礎:二進制基礎04,十進整制數轉化為二進制整數
在確保你已經學會了除 2 取余法之后,你可以接著往下學習本節的知識。
在上一節里面,我們講了原碼的結構。一個原碼,它分為兩個字段。無論這個原碼是 8 位的,還是 16 位的,32 位的,還是 64 位的,它都是分為兩個字段。最高位是一個字段,它是符號位。而其余位是另一個字段,數值位。
給定一個十進制整數,首先呢,看它是 0,正數,還是負數。如果是 0 的話,它的原碼就是全 0 。如果是正整數的話,則符號位為 0,數值位為這個十進制正整數對應的二進制數。如果是負整數的話,則符號位為 1,而數值位是這個十進制負整數的絕對值所對應的二進制數。
舉例來說,如果我們給定 49 這個 十進制正整數,那么,由于是正整數,所以,符號位為 0 。而數值位則是十進制整數 49 所對應的二進制數?11 0001 。假定這個數是 8 位整數,則它的原碼就是 0011 0001 。如果這個數是 16 位整數,則它的原碼是 0000 0000 0011 0001 。注意,填完了符號位與最簡數值位之后,剩余位補 0 。
再來舉一個例子,假定我們要來表示的整數是 -93 。這是一個負整數,所以,符號位為 1 。然后呢,這個負整數的絕對值為 93,所以,數值位為十進制整數 93 所對應的二進制數?101 1101 。假定這個數是 8 位整數,則它的原碼為 1101 1101 。假定這個數是 16 位整數,則它的原碼是 1000 0000 0101 1101 。注意,填完了符號位與最簡數值位之后,剩余位補 0 。
二.? ? 例題
在這里,我只舉一個例子。求解 ±103 的原碼。
無論是 +103,還是 -103,它的絕對值都是 103 。我們先求解 103所對應的二進制數,結果為?110 0111 。這個結果,我們將其作為數值位。
如果是 8 位二進制數,則 +103 的原碼是 0110 0111,-103 的原碼是 1110 0111 。
如果是 16 位二進制數,則 +103 的原碼是 0000 0000 0110 0111,-103 的原碼是 1000 0000 0110 0111 。
三.? ? 特殊的原碼
對于 0 這個數,它的 8 位原碼為 0000 0000,它的 16 位原碼為 0000 0000 0000 0000 。
但是現在有個問題,1000 0000,它代表著什么數呢?符號位為 1,而數值位為 0,它所代表的數,是 -0 嗎?
不是的。
某一個原碼,當符號位為 1,而數值位是全 0 時,這個原碼所代表的數值,要看符號的位權是什么。
在某一個原碼里面,我們設符號位的位權為 a,某一個數,它正好是說,符號位為 1,數值位是全 0,則這個原碼所代表的十進制數為??。
對于 8 位二進制數,符號位的位權為 7,所以,a 等于 7,則 1000 0000 所代表的十進制數為?,為 -128 。
對于 16?位二進制數,符號位的位權為 15,所以,a 等于 15,則 1000 0000 0000 0000 所代表的十進制數為?,為 -32768?。
四.? ? 有符號數的范圍
在學習 C/C++ 的時候,我們大概都學習過,8 位有符號整數的范圍是 -128 ~ 127,而 16 位有符號整數的范圍是 -32768 ~ 32767 。
也就是說,signed char 型變量的范圍是?-128 ~ 127,而 short 型變量的范圍是?-32768 ~ 32767 。
那么,為什么是這個范圍呢?
我們先來說 8 位原碼。?
(一)8 位原碼的表示范圍
首先呢,當 8 位全 0 時,此原碼表示的數是 0 。
然后呢,當 符號位是 0,且數值位并非全 0 時,則此原碼代表正整數。此時,這個正整數的數值位的取值范圍是 000 0001?~ 111 1111,也就是 1 ~ 127 。
當符號位為 1 時,且數值位并非全 0 時,則此原碼代表負整數。此時,這個負整數的數值位的取值范圍是 000 0001?~ 111 1111,也就是說,這個負整數的絕對值為?1 ~ 127 。所以,在這種情況里,此原碼的取值范圍是 -127 ~ -1 。
當符號位 為 1,且數值位是全 0 時,此時,這個負整數所表示的數為 -128 。
我們將以上幾種情況清點以下,-128,-127 ~ -1,0,1 ~ 127,把它們組合起來,就是 -128 ~ 127 。
(二)16 位原碼的表示范圍
首先呢,當 16?位全 0 時,此原碼表示的數是 0 。
然后呢,當 符號位是 0,且數值位并非全 0 時,則此原碼代表正整數。此時,這個正整數的數值位的取值范圍是 000 0000 0000 0001?~ 111 1111 1111 1111,也就是 1 ~ 32767 。
當符號位為 1 時,且數值位并非全 0 時,則此原碼代表負整數。此時,這個負整數的數值位的取值范圍是 000 0000 0000 0001?~ 111 1111 1111 1111,也就是說,這個負整數的絕對值為?1 ~ 32767 。所以,在這種情況里,此原碼的取值范圍是 -32767 ~ -1 。
當符號位 為 1,且數值位是全 0 時,此時,這個負整數所表示的數為 -32768 。
我們將以上幾種情況清點以下,-32768,-32767 ~ -1,0,1 ~ 32767,把它們組合起來,就是 -32768 ~ 32767 。
結束語
本節內容,我覺得應該還可以。希望大家能夠學好本節知識。
專欄導航
本節文章分別屬于《Win32 學習筆記》和《MFC 學習筆記》兩個專欄,故劃分為兩個專欄導航。讀者可以自行選擇前往哪個專欄。
(一)WIn32 專欄導航
上一篇:計算機基礎:編碼02,有符號數編碼,原碼
回到目錄
下一篇:無
(二)MFC 專欄導航
上一篇:計算機基礎:編碼02,有符號數編碼,原碼
回到目錄
下一篇:無