在計算機系統中,數值一律用補碼來表示和儲存。原因在於,使用補碼,可以將符號位和數值位統一處理;同時,加法和減法也可以統一處理。此外,補碼與原碼的的相互轉換,其運算過程是相同的,不需要額外的硬體電路。
1.正數的補碼
正整數的補碼與原碼相同,ie:+9的補碼是00001001。
2.負數的補碼
求負整數的補碼,原碼符號位不變,先將原碼減去1,最後數值各位取反。(但由於2進製的特殊性,通常先使數值位各位取反,最後整個數加1。)ie: -5的原碼(10000101)→符號位不變(10000101)→數值位取反(11111010)→加1(11111011)
3.0的補碼是唯一的
[+0]補=[+0]反=[+0]原=00000000
[ -0]補=11111111+1=00000000
4.補碼轉化為原碼
已知乙個數的補碼,求原碼的操作其實就是對該補碼再求補碼:
⑴ 如果補碼的符號位為「0」,表示是乙個正數,其原碼就是補碼。
⑵ 如果補碼的符號位為「1」,表示是乙個負數,那麼求給定的這個補碼的補碼就是要求的原碼。
5.為什麼用補碼儲存
補碼的運算規則可以使加法和減法統一處理。
補碼加法:
[x+y]補 = [x]補 + [y]補 ie,x=+0110011,y=-0101001
[x]原=00110011,[y]原=10101001
[x]補=00110011,[y]補=11010111
[x+y]補 = [x]補 + [y]補 = 00110011+11010111=00001010
補碼減法:
[x-y]補 = [x]補 - [y]補 = [x]補 + [-y]補
1的原碼00000001,轉換成補碼:00000001
-1的原碼10000001,轉換成補碼:11111111
1+(-1)=0
00000001+11111111=00000000
00000000轉換成十進位制為0
6.為什麼16位int是-32768到32767
如果以最高位為符號位,二進位制原碼最大為0111111111111111=2的15次方1=32767 最小為1111111111111111=-2的15次方減1=-32767,此時0有兩種表示方法,即正0和負0:0000000000000000=1000000000000000=0 所以,二進位制原碼表示時,範圍是-32767~-0和0~32767,因為有兩個零的存在,所以不同的數值個數一共只有2的16次方減1個,比16位二進位制能夠提供的2的16次方個編碼少1個。
但是計算機中採用二進位制補碼儲存資料,即正數編碼不變,從0000000000000000到0111111111111111依舊表示0到32767,而負數需要把除符號位以後的部分取反加1,即-32767的補碼為1000000000000001。
到此,再來看原碼的正0和負0:0000000000000000和1000000000000000,補碼表示中,前者的補碼還是0000000000000000,後者經過非符號位取反加1後,同樣變成了0000000000000000,也就是正0和負0在補碼系統中的編碼是一樣的。
但是,我們知道,16位二進位制數可以表示2的16次方個編碼,而在補碼中零的編碼只有乙個,也就是補碼中會比原碼多乙個編碼出來,這個編碼就是1000000000000000,因為任何乙個原碼都不可能在轉成補碼時變成1000000000000000。所以,人為規定1000000000000000這個補碼編碼為-32768。 所以,補碼系統中,範圍是-23768~32767。 因此,實際上,二進位制的最小數確實是1111111111111111,只是二進位制補碼的最小值才是1000000000000000,而補碼的1111111111111111是二進位制值的-1。
static的一些相關知識
關鍵字static是乙個修飾符,其可以修飾一下幾種 1,屬性 2,方法 3,語句塊 4,內部類。static代表的是類相關,static修飾的東西,所有的物件共享 共享同一塊的記憶體區域 其修飾的一些東西放在了static池中 堆記憶體中一塊新的記憶體區域 池雖然是堆裡的一塊區域,但是同堆的最大的不...
關於shell Makefile相關的一些記錄
20130727工作中遇到的問題 問題背景 需要把產品定義標頭檔案裡面的產品定義取出來,然後按照產品定義分模組編譯,shell裡面做的工作主要是從product type.h提出產品的定義,然後把產品定義export到環境變數,供makefile使用,makefile根據產品定義傳各個模組的編譯巨集...
關於IP位址的一些相關知識點
網際網路協議位址,又譯為網際協議位址。標識終端在internet中的訪問位置 寫法ip位址是乙個32位二進位制數 但是用十進位制描述 的位址,由4個8位欄位組成,每個字段之間用點號隔開,用於標識tcp ip宿主機。分類a b c d e 五類範圍 a類範圍 規定第一位取0,其餘為取任意值 0 000...