帶正負號
帶正負號[註 1](英文:signed),簡稱帶號[註 2],喺中國大陸叫有符號,喺電腦運算,係指一個概念上嘅數值可以係零或者正數,亦可以係負數,又或者一個可以擺數字嘅實際位置(例如位址或者變數)可以擺零或者正數,亦可以擺負數。呢種性質主要係影響以二進制格式表示嘅整數資料類型同佢衍生嘅其他資料類型,特別係當牽涉到中低級程式語言同一啲比較低級(即係接近機器嘅實際運作方式)嘅表示法嘅時候(包括網絡協議、檔案格式等等)。
二進制
[編輯]帶正負號會係一個問題,係因為電腦處理資料係用位元,而一連串嘅位元 直接代表嘅係一個二進制整數值,原則上係 ,亦即係原則上只可能係零或者正數,所以表示負數就要另外諗計。而最常見嘅計就一共有四條,叫原碼(signed binary[1],又叫 sign–magnitude[2])、一補碼[註 3](中國大陸叫反碼;one’s complement[3][4])、二補碼[註 4](中國大陸叫補碼;two’s complement[5])同移碼(offset binary,又叫 excess-n)。
喺個人電腦,一般嚟講用嘅係二補碼。
帶正負號嘅問題基本上並唔影響浮點數;浮點數係一種類似科學記數法嘅形式,喺目前通用嘅標準,正負號同絕對數值分開擺,有啲類似上面講嘅 「原碼」 表示方法。
Signed binary
[編輯]Signed binary 或者 sign–magnitude 係指將可以用嘅位元數量預留一個位元表示正定負;方法係用最有效位元(寫出嚟嗰陣寫喺最左便嘅二進制數字)表示正負號(sign),其餘表示實際數值嘅絕對值(magnitude),正負號位元[暫譯](sign bit)傳統上 0 代表正,1 代表負,不過冇話一定要係咁,呢種方法好處係可以表示負數,唔好處係正數同負數唔可以直接加減[6]。喺呢種方法之下亦會有正零同負零嘅分別;如果有 個位元,可以表示嘅數值係介乎 至 之間。
一補碼
[編輯]一補碼係指負數用一嘅互補[註 5](complement)表示,即係如果負數值嘅位元係 ,就用 表示,好處係可以表示負數,唔好處係正數同負數直接加減可能會得出錯嘅答案[7]。一補碼將可以用嘅位元數量斬半,一半表示帶正號嘅數,一半表示帶負號嘅數,如果有 個位元,可以表示嘅數值亦係介乎 至 之間。
例如,用四個位元嘅一補碼,二進制嘅 0001 係正一,1110 係負一。加埋係 1111,即係負零,冇錯;但係正二(0010)直接加負一(1110)得出 0000(進一),唔啱。
二補碼
[編輯]二補碼係指負數嘅表示方法係一補碼加一,呢種表示法嘅好處係正負數直接加減唔會錯[8]。二補碼將可以用嘅位元數量斬半,一半表示零或者正數,一半表示負數;如果有 個位元,可以表示嘅數值係介乎 至 之間。
例如,用四個位元嘅二補碼,非負數 0000(零)至 0111(七),負數部分 1000(負八)至 1111(負一)。二進制嘅 0001 係正一,1111 係負一。加埋係 0000(進一),即係零,冇錯;正二(0010)直接加負一(1111)得出 0001(進一),一樣冇錯。
Excess-n
[編輯]Excess-n 係指數值嘅表示方法係將實際數值偏移一個合理嘅正整數 ,務求最細嘅內碼係零,即係如果實際數值係 ,就用 代表。例如,用四個位元,0000 至二進 1111 正常表示零至十五,但係如果用 excess-3,就表示負三至正十二;又,如果用 excess-10,就表示負十至正五。偏移幾多冇規定,係按需求。如果有 個位元,可以表示嘅數值係介乎 至 之間(「合理」 例如可以係 )。
二進制編碼十進制
[編輯]帶正負號嘅問題亦影響到二進制編碼十進制(BCD),但係因為呢種表示方法係十進,表示方法唔會用二補碼,而係用十補碼[註 6](ten’s complement)[9]。
十補碼
[編輯]同二進制嘅情形類似,BCD 嘅十補碼係指負數嘅表示方法係九補碼[註 7] 加一,而九補碼係指負數用九嘅互補[註 5] 表示,亦即係如果某負數嘅某位數字係 ,嗰個數位就用 代表[9]。
例如,用八個位元,正二係十六進 02。正一係十六進 01;負一嘅九補碼十六進 98,十補碼 99。正二直接加負一,十六進 02 加 99,得出 01(進一)。
非帶正負號
[編輯]帶正負號嘅相反叫非帶正負號[註 1](英文:unsigned),喺中國大陸叫無符號,指某資料類型淨係可以表示零或者正數,唔可以表示負數。帶正負號同非帶正負號嘅資料唔可以立亂溝亂用;除非隻程式語言識得自動轉,溝亂用會導致計錯數。
文獻
[編輯]- ↑ Zaks 1980, p. 16.
- ↑ Bacon, Jason W. (2010–2011). "Computer Science 315 Lecture Notes". 原著喺14 February 2020歸檔. 喺21 February 2020搵到.
- ↑ "Array multiplier operating in one's complement format". US. 1981-03-10.
- ↑ Zaks 1980, p. 17.
- ↑ Zaks 1980, p. 18.
- ↑ Zaks 1980, pp. 16–18.
- ↑ Zaks 1980, pp. 17–18.
- ↑ Zaks 1980, pp. 18–19.
- ↑ 9.0 9.1 Zaks 1980, p. 66.
註
[編輯]- ↑ 1.0 1.1 譯名見:〈內建類型 (C++)〉 (香港中文)。微軟。2024年11月21號。喺2024年12月15號搵到。
- ↑ 譯名見:Johnny (2022年12月25號)。〈C++ 20 特性合集 (三)〉 (香港中文)。喺2024年12月16號搵到。
- ↑ 譯名見:科技教育組 2023年, p. 26
- ↑ 譯名見:科技教育組 2023年, p. 33
- ↑ 5.0 5.1 譯名參考:科技教育組 2023年, p. 7
- ↑ 譯名參考:科技教育組 2023年, p. 33
- ↑ 譯名參考:科技教育組 2023年, p. 26
書目
[編輯]- Zaks, Rodnay (1980). Programming the 6502 (英文). Sybex.
- 科技教育組 (2023年1月)。〈中學資訊及通訊科技科常用英漢辭彙〉 (PDF) (香港中文)。香港特別行政區政府教育局課程發展處。喺2023年10月30號搵到。