二進位負數必須使用二的補數2's complement
二的補數的定義為 (一的補數+1)
而一的補數定義為 1轉成0 0轉成1
舉例:
3為0011
則一的補數為1100
而二的補數為1100 + 1 = 1101
注意一下如果有n個bit來表達二的補數
則只能表達2^(n-1)這麼多種
而範圍為 -2^(n-1) ~ 2^(n-1)-1
例如4bits 只能表達 -8 ~ +7
程式寫法就先變為正數 轉二進位之後
再做not(1轉0;0轉1)運算 再+1
還原的時候 先判斷最高位是否為1
如果是1就代表是負數 反回去算 先減一 再做not 再算回去十進位
如果是0就是正數 直接算回十進位
至於小數就有些麻煩了
先講解一下十進位的表示方式
12.78
這邊是
1*10^1 + 2*10^0 + 7*10^-1 + 8*10^-2
應該看的懂吧
其實每種進位的方式都是依照這個模式
所以1100.101就是
1*2^3 + 1*2^2 + 0*2^1 + 0*2^0 + 1*2^-1 + 0*2^-2 + 1*2^-3
做法..呵呵..我投降..沒有紙筆我不太會講..而且其實我快忘了
還有一種浮點數表示法
就是我們常用的float double之類的
表達方式大概就像科學表示法一樣
不過他依然是使用二進位
例: 1111 * 2^10
先看成1.111 * 2^10
然後變成10進位
1.111為1.875
->1.875 * 2^2 = 7.5
他是將一串很長的bit分隔為三段
第一段為sign 他只佔了1個bit 值1代表負數 0代表正數
第二段為2的指數部分從負的到正的..負數一樣使用二的補數法
第三段為小數部分 就是剛剛的那一段1111
至於怎麼分段..IEEE有規定的
32bits的話
左邊第1個是sign
往右數2~9是指數部分
最右邊的10~32就是小數部分了
64bits為1bit的sign;
11bits的指數;
52bits的小數
浮點數表示法的精確度和他所造成的擷取錯誤就不再討論了..
有興趣翻書吧..
這是電腦裡面浮點數的表示法
挺不好懂的..有興趣的話翻一翻計概的書吧..
這些是我僅存的記憶!!
看看就好..我承認小弟我的表達能力甚差..講的不是很好請見諒
恩..順便找到一個網頁給大家參考囉..
http://www.csie.ncnu.edu.tw/~s...spro/bcc.html在網頁的下半部有講到數值的表示法..
(看網址好像是暨南大學資工系的某教授課程教材)