首先十進位制和其它任何任何進位制都沒有區別,數學上任何“合理”的進位制都是完全等價的,跟數的性質無關,只是表示方法。
一般大家的直覺,使用的都是另一種:sign magnitude,一個單獨的符號位,其它位表示絕對值。這種表示法的缺點就是問題中提到的-0問題,當然-0並不特殊只是多餘,-0和+0表示同一個數,從工程實現角度說非常“不乾淨”。
所以計算機領域從第一天起就沒有使用過這種看似最直觀的 sign magnitude 表示法。當然這裡還有另一個原因,這種表示法做加減運算不方便(機器做運算都要靠一個個閘電路來搭,所以對結構最佳化非常看重)。
這時數學家恰好提供了另一個非常巧妙的基於二進位制的表數法:two"s complements。具體定義不展開了,隨便可以查到。這種表示法有幾個優點:
第一,零的表述唯一,不存在±零的問題。
第二,加減法出人意料的簡單,完全不需要區分正負性,加法器的每位基本單元(a/b/進位輸入,和/進位輸出)就是幾個“異或”操作。而減法相當於加法(減數取反+1),所以一般設計都叫“加減法器”。
需要再次指出,表數法和“數”的性質無關,是一種工程實現時的取捨。two"s complements 在計算機領域是絕對主流的方式,原因是它帶來的便利。但這並不是金科玉律。根據場景不同,偶爾也會使用其它的表數法。
最經典的的一個應用場景是“跨時鐘域”時需要保障“數”在跳變時不被“錯誤的部分的讀取”,所以要求在加減1時只有1位發生變化(這樣跨時鐘取樣時不論採到跳變前後的數都是完整的)。
可以提供上述特性的表數法最有名的是 gray code 格雷碼。不過格雷碼需要在2的冪次上定義,所以實際應用往往會採用一些變形的方式。
還有一種常見的表數法是 one hot,中文好像生翻成“單熱”,這個一般在晶片設計領域用於狀態機,好處多多。當年初剛畢業入行時一個公司的印度大神給我們上課,第一課就是講為什麼所有狀態機都“應該”用 one hot,受益良多。
總之,±零沒有數學意義上的特殊性,但影響工程實現的“乾淨程度”和“便利程度”,通常我們稱之為是否“優雅”。計算機領域普遍使用的 two"s complements 表數法在大多數時候,顯得更加“優雅”。僅此而已。
首先十進位制和其它任何任何進位制都沒有區別,數學上任何“合理”的進位制都是完全等價的,跟數的性質無關,只是表示方法。
一般大家的直覺,使用的都是另一種:sign magnitude,一個單獨的符號位,其它位表示絕對值。這種表示法的缺點就是問題中提到的-0問題,當然-0並不特殊只是多餘,-0和+0表示同一個數,從工程實現角度說非常“不乾淨”。
所以計算機領域從第一天起就沒有使用過這種看似最直觀的 sign magnitude 表示法。當然這裡還有另一個原因,這種表示法做加減運算不方便(機器做運算都要靠一個個閘電路來搭,所以對結構最佳化非常看重)。
這時數學家恰好提供了另一個非常巧妙的基於二進位制的表數法:two"s complements。具體定義不展開了,隨便可以查到。這種表示法有幾個優點:
第一,零的表述唯一,不存在±零的問題。
第二,加減法出人意料的簡單,完全不需要區分正負性,加法器的每位基本單元(a/b/進位輸入,和/進位輸出)就是幾個“異或”操作。而減法相當於加法(減數取反+1),所以一般設計都叫“加減法器”。
需要再次指出,表數法和“數”的性質無關,是一種工程實現時的取捨。two"s complements 在計算機領域是絕對主流的方式,原因是它帶來的便利。但這並不是金科玉律。根據場景不同,偶爾也會使用其它的表數法。
最經典的的一個應用場景是“跨時鐘域”時需要保障“數”在跳變時不被“錯誤的部分的讀取”,所以要求在加減1時只有1位發生變化(這樣跨時鐘取樣時不論採到跳變前後的數都是完整的)。
可以提供上述特性的表數法最有名的是 gray code 格雷碼。不過格雷碼需要在2的冪次上定義,所以實際應用往往會採用一些變形的方式。
還有一種常見的表數法是 one hot,中文好像生翻成“單熱”,這個一般在晶片設計領域用於狀態機,好處多多。當年初剛畢業入行時一個公司的印度大神給我們上課,第一課就是講為什麼所有狀態機都“應該”用 one hot,受益良多。
總之,±零沒有數學意義上的特殊性,但影響工程實現的“乾淨程度”和“便利程度”,通常我們稱之為是否“優雅”。計算機領域普遍使用的 two"s complements 表數法在大多數時候,顯得更加“優雅”。僅此而已。