1樓:做而論道
什麼是溢位?
溢位,是指資料的大小,超出了編碼所能表示的範圍。
不僅是補碼計算,任何形式的計算,都可能產生溢位。
比如:1999 年、2000 年 ...,這是用 4 位十進位制表示。
當到了 9999 年,再過一年,你如果還用 4 位表示,就會溢位了。
如果不限制編碼的位數,那麼,就不存在溢位的問題。
無符號數的溢位
計算機所能運算的位數是固定的,如:八位機、16、32、64 位機。
當字長為八位時,其計數範圍是:0000 0000~1111 1111。
它們可以表示【自然數】,寫成十進位制就是:0~255。
在小學學過的【自然數】,在計算機專業,被偷改為「無符號數」。
如果在其最大值(255)再加上一,就會超出表示範圍,發生溢位。
此時,八個位就都為 0,進位將為 1。
進位為 1,就是無符號數溢位的標誌。
進位 1,代表十進位制的 256。
256 是八位二進位制**的計數週期,又被計算機專業改稱為「模」。
帶符號數的溢位
八位二進位制也能表示【整數】,包括了【正整數、零和負整數】。
在小學學過的【整數】,在計算機專業中,偷改為「帶符號數」。
此時,0 ~ 127,就直接代表【零和正整數】;
128~255,是以補碼代表【負整數】,即代表-128~-1。
在正數最大值(+127)上再加+1,就會超出表示範圍,發生溢位。
此時得到的是 128,這是負數(-128)的補碼。
注意,此時的進位為 0,結果的符號錯誤,才是溢位的特徵。
在負數最小值(-128)再加-1,也會超出範圍,發生溢位。
計算如下:
1000 0000
+1111 1111
(1)0111 1111
此時,得到的是正數(+127)!
注意,此時的進位為 1,並無意義。
結果的符號錯誤,才是溢位的特徵。
「帶符號數」溢位的特徵是:運算結果的符號,與正常結果相反。
「帶符號數」的溢位,與進位是 1 是 0,並無關係。
判斷是否溢位的方法
因為「帶符號數」運算髮生溢位,必定是結果超出範圍。
所以,只有如下四種運算,才有可能出現溢位:
正數+正數、負數+負數、正數-負數、負數-正數。
其它運算如:正-正、...,就不必考慮溢位了。
由人工計算:就可根據資料的符號來判斷,如:
正+正,出現負的結果;
負+負,出現正的結果;
發生上述四種之一,就是溢位。
也可考查進位與次高位的進位,兩者不同,就是溢位。
用 cpu 計算:cpu 能夠自動判斷,如果發生溢位則會置位 of。
2樓:
判斷溢位,有三種方法:
1.由人進行計算,並判斷:正+正=負、負+負=正、...,這就是溢位。
2.由cpu進行計算,由人觀察標誌位:ov=1,就是溢位。
3.由cpu進行計算,並給出溢位標誌位:c7異或c6,為1,就令ov=1。
樓主問的是那種方法?
3樓:可軒
若運算結果超出原先字長表示的數值範圍,會溢位。
補碼加法運算溢位判斷三種方法:
[方法一]xf、yf分別兩個數的符號位,zf為運算結果符號位。
當xf =yf =0(兩數同為正),而zf=1(結果為負)時,負溢位;
當出現xf =yf =1(兩數同為負),而zf=0(結果為正),正溢位.
[方法二] cs表示符號位的進位,cp表示最高數值位進位,⊕表示異或。
若 cs⊕cp =0 ,無溢位;若 cs⊕cp =1 ,有溢位。
[方法三] 用變形補碼進行雙符號位運算(正數符為00,負數符號以11)
若運算結果的符號位為"01",則正溢;若結果雙符號為10,則負溢位;
若結果的雙符號位為00或11,無溢位。
補碼運算為什麼會溢位
4樓:沙裡波特
運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。
正數+正數,得到的和,太大了,就會溢位。
此外還有:負數+負數、正數-負數、負數-正數,
這四種演算法,都有可能溢位。
而:正數-負數,等四種,是絕對不會溢位的。
知道了這些,就不用「濫判斷」是否溢位了。
八位的補碼是:0000 0000~1111 1111。
寫成十進位制就是:0~255。
其中的 0~127,是正數的補碼。
而 128~255,則是-128~-1 的補碼。
所能表示的範圍是:-128~+127。
按照補碼運算:99 + 87 = 186。
超出了所能表示的範圍,當然是溢位了。
即:正99+正87,卻得到了-70 的補碼。
5樓:柒月黑瞳
運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。
如何判斷補碼溢位:
可以通過最高位與次高位進位來判斷:若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢位。
溢位現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢位,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢位,也可能出現正常進位。 由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢位與正常進位。
補碼溢位詳解:
128 =1000 0000,8位機器
[-128]原碼 = 1000 0000發生了溢位,最高位表示符號位:0為正數,1為負數
[-128]反碼 = 1111 1111除符號位外,各位取反
[-128]補碼 = 1000 0000 反碼的末位加1,不能影響符號位
6樓:做而論道
用8位二進位制數來說明。
8位數中的最高位,是符號位,後面七位,是數值位。
按照這樣的規則,8位二進位制數的補碼,只能表示出-128~+127。
99和87,它們都在-128~+127之內,可以用8位二進位制數的補碼來表示。
但是它們相加後,就超過了-128~+127,它們的七位數值位產生了進位,把符號位變成了1,結果,按照補碼的規則,就成了負數。
這個錯誤的結果,就是**於「溢位」。
「溢位」的原因就是結果的數字太大,超出了8位補碼所能表示的範圍。
7樓:張顯寅
99d=2^6+2^5+2^1+2^0=0110 0011b87d=2^6+2^4+2^2+2^1+2^0=0101 0111b0110 0011b
0101 0111b
1011 1010b
即99d+87d=1011 1010b
1011 1010b
取反為0100 0101b
加1為0100 0110b
即(99d+87d)的補碼=0100 0110b 無溢位因為99d+87d=186d
對於無符號8位二進位制數來說186d在0 - (2^8)-1即0 - 255這個區間當中 故無溢位
另外計算補碼有個更加方便的公式
對於99d+87d=186d這個數在0 - 255 這個區間當中 那麼
186d可以看作無符號8位二進位制數
那麼186d的補碼=256d-186d=70d即(99d+87d)的補碼=70d=0100 0110b=106o=46h
8樓:匿名使用者
無論採用何種機器數,只要運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。
如何判斷補碼溢位:
可以通過最高位與次高位進位來判斷:若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢位。
溢位現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢位,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢位,也可能出現正常進位。 由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢位與正常進位。
只有有符號數存在溢位,無符號數不存在溢位~
什麼是補碼加減運算溢位?判別溢位有哪幾種方法?並我說明工作原理。
9樓:嘿嘿噫嘿嘿
對於加法來說,運算元符號可能是:
1. [正] + [正]
2. [正] + [負]
3. [負] + [正]
4. [負] + [負]
對於減法來說:
1. [正] - [正] 相當於加法裡的(2)
2. [正] - [負] 相當於加法裡的(1)
3. [負] - [正] 相當於加法裡的(4)
4. [負] - [負] 相當於加法裡的(3)
加法裡,哪種操作會溢位?
對於一個有n位二進位制的補碼,其能表示的數字的範圍是:
-2^(n-1) ~ +2^(n-1)-1
負數:-2^(n-1) 到 -1
正數:1 到 2^(n-1)-1
那麼對於加法來說:
「[正] + [負]」或者「[負] + [正]」永遠都不會溢位,不管兩個運算元取值多少,結果都落在有效範圍內。
而超出有效範圍的兩種可能性就是:
1. [正] + [正]
2. [負] + [負]
那麼再看這兩種操作如果超出範圍的話,表現形式是什麼樣的:
定義兩個事件:
1. 最高有效位進位:對於n位補碼,第n-1位發生了進位;
2. 符號位進位:對於n位補碼,第n位符號位發生;
定義4個邊界值,以8位有效字長為例:
最大正127 (0111 1111)
最小正1 (0000 0001)
最小負-128(1000 0000)
最大負-1 (1111 1111)
列出所有組合(消除交換律重複)
符號位 最高有效位 是否發生溢位 最高有效位進位 符號位進位
[最小正] + [最小正] 0 0 0 0 n n n
[最小正] + [最大正] 0 0 0 1 y y n
[最小正] + [最小負] 0 1 0 0 n n n
[最小正] + [最大負] 0 1 0 1 n y y
[最大正] + [最大正] 0 0 1 1 y y n
[最大正] + [最小負] 0 1 1 0 n n n
[最大正] + [最大負] 0 1 1 1 n y y
[最小負] + [最小負] 1 1 0 0 y n y
[最小負] + [最大負] 1 1 1 0 y n y
[最大負] + [最大負] 1 1 1 1 n y y
所以,從規律上看凡是發生溢位操作,「最高有效位進位」和「符號位進位」必然是一個是y另一個是n,凡是不發生溢位的操作,必然是兩個全y或者兩個全n
這就是根據最高有效位和符號位發生進位的異或來判斷是否溢位規律。
下面是邏輯證明環節,很繞,證明方法很簡單,就是把幾種條件都列出來判斷一下即可:
[正]+[正]溢位,因為兩個都是正整數,所以符號位都是0,溢位時最高位發生了進位,但因為符號位是0,0加上進位的1是永遠不會發生進位的。所以對於前面定義的兩個事件:「最高有效位進位」發生了,「符號位進位」未發生。
[正]+[負]不溢位時,此時設正數範圍包括0:
如果結果為負整數,因為第二個運算元的符號位是1,結果的符號位也是1,那麼「符號位進位」未發生,同時「最高有效位進位」也未發生。因為如果發生了,會產生一個進位1,與符號位1相加會倒是符號位變化,而此時符號位是不變的,所以可以肯定兩個事件都沒有發生。
如果結果為正整數,那麼必然同時發生了「最高有效位進位」和符號位進位」,因為第二個運算元的符號位是1,但結果符號位是0,所以符號位有進位(1 + 0 + x = 10)。而第一個運算元的符號位又是0,所以必然是最高有效位產生了一位進位才讓符號位獲得了一個1才能進位,對於符號位的計算來說[正]符號位0 + [負]符號位1 + 最高有效位進位x = 10,x必然是1
[負]+[負]溢位,因為兩個都是負整數,所以符號位都是1,溢位時符號位發生了進位(兩個都是1)。再看最高有效位是否有進位,對於8位的負數加法來說,產生溢位,意味著結果範圍在-129~-256之間,這個範圍內的二進位制數,以9位補碼來看,就是1 0111 1111到1 0000 0000,那麼這兩個數如果減掉符號位相加的1 0000 0000的話,得到的結果就是 0111 1111到0000 0000,這個範圍內的數字第8位都是0,所以從符號位的計算可以得知[負]符號位1 + [負]符號位1 + 最高有效位進位x = 10,最高有效位的進位值必然是0,所以最高有效位必然沒有發生進位。
參考資料
知乎
移動公司為什麼會知道我用的是什麼手機
當你使用相關軟體時,這些軟體會獲取你的裝置識別碼,瀏覽網頁時,網頁請求獲取裝置資訊,瀏覽器就把裝置識別碼傳過去了,所以就知道你的手機型號了,所以說,不只是中國移動知道你用的什麼手機,只要是需要獲取裝置識別碼的都能知道你的什麼手機 可能是上網時手機型號在網上傳了 每部手機都有不同的效能,因為手機裡就安...
為什麼我的多肉葉子會萎縮?有沒有補救方法?求多肉達人教方法
你摸一下花土,如果花土是乾的,那就是缺水了。秋季是多肉植物的生長旺季,需水較多,澆水要做到見幹見溼,就是花土快乾透的時候再一次性澆透。多肉的葉子萎縮是什麼原因?多肉植物葉子萎縮的原因如下 下面以石蓮花舉例說明 1 水分過多 藍石蓮是景天科石蓮花屬的多肉植物,如果澆水太勤了,不會讓藍石蓮生長得更好,相...
為什麼有時候會那麼在意別人的看法?我明知道不可能讓每人都喜歡自己,卻總是做事小心謹慎的
嘿嘿。bai。你要學著改變。要 du學著變得開朗些zhi。做真正的自己 dao。想哭就 哭想笑內就笑。讓所容有人都喜歡自己不是不可能的。那就要學著做事圓滑些。但是這樣的人不會有很多的鐵哥們兒 真心的好朋友 所以嘛。我建議 您要學會自信,交朋友這件事嘛。我覺得能處就處,不能處就散。交朋友是要交合的來的...