補碼運算為什麼會溢位,補碼計算為什麼會溢位

2023-01-10 16:01:03 字數 6426 閱讀 3288

1樓:吳愜沈昂傑

運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。

如何判斷補碼溢位:

可以通過最高位與次高位進位來判斷:若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢位。

溢位現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢位,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢位,也可能出現正常進位。

由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢位與正常進位。

補碼溢位詳解:

128=1000

0000,8位機器

[-128]原碼

=1000

0000發生了溢位,最高位表示符號位:0為正數,1為負數[-128]反碼

=1111

1111除符號位外,各位取反

[-128]補碼

=1000

0000

反碼的末位加1,不能影響符號位

2樓:做而論道

什麼是溢位?

溢位,是指資料的大小,超出了編碼所能表示的範圍。

發生溢位時,該組編碼,就不能正確的表示資料。

不僅是補碼計算,任何形式的計算,都可能產生溢位。

比如: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。

補碼運算為什麼會溢位

3樓:沙裡波特

運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。

正數+正數,得到的和,太大了,就會溢位。

此外還有:負數+負數、正數-負數、負數-正數,

這四種演算法,都有可能溢位。

而:正數-負數,等四種,是絕對不會溢位的。

知道了這些,就不用「濫判斷」是否溢位了。

八位的補碼是:0000 0000~1111 1111。

寫成十進位制就是:0~255。

其中的 0~127,是正數的補碼。

而 128~255,則是-128~-1 的補碼。

所能表示的範圍是:-128~+127。

按照補碼運算:99 + 87 = 186。

超出了所能表示的範圍,當然是溢位了。

即:正99+正87,卻得到了-70 的補碼。

4樓:柒月黑瞳

運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。

如何判斷補碼溢位:

可以通過最高位與次高位進位來判斷:若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢位。

溢位現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢位,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢位,也可能出現正常進位。 由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢位與正常進位。

補碼溢位詳解:

128 =1000 0000,8位機器

[-128]原碼 = 1000 0000發生了溢位,最高位表示符號位:0為正數,1為負數

[-128]反碼 = 1111 1111除符號位外,各位取反

[-128]補碼 = 1000 0000 反碼的末位加1,不能影響符號位

5樓:做而論道

用8位二進位制數來說明。

8位數中的最高位,是符號位,後面七位,是數值位。

按照這樣的規則,8位二進位制數的補碼,只能表示出-128~+127。

99和87,它們都在-128~+127之內,可以用8位二進位制數的補碼來表示。

但是它們相加後,就超過了-128~+127,它們的七位數值位產生了進位,把符號位變成了1,結果,按照補碼的規則,就成了負數。

這個錯誤的結果,就是**於「溢位」。

「溢位」的原因就是結果的數字太大,超出了8位補碼所能表示的範圍。

6樓:張顯寅

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

7樓:匿名使用者

無論採用何種機器數,只要運算的結果大於數值裝置所能表示數的範圍,就會產生溢位。

如何判斷補碼溢位:

可以通過最高位與次高位進位來判斷:若最高數值位向符號位的進位值與符號位產生的進位輸出值不相同,則表明加減運算產生了溢位。

溢位現象應當作一種故障來處理,因為它使結果數發生錯誤。異號兩數相加時,實際是兩數的絕對值相減,不可能產生溢位,但有可能出現正常進位;同號兩數相加時,實際上是兩數的絕對值相加,既可能產生溢位,也可能出現正常進位。 由於補碼運算存在符號位進位自然丟失而運算結果正確的問題,因此,應區分補碼的溢位與正常進位。

只有有符號數存在溢位,無符號數不存在溢位~

補碼計算為什麼會溢位??

8樓:沙裡波特

溢位,是指資料的大小,超出了編碼所能表示的範圍。

不僅是補碼計算,任何形式的計算,都可能產生溢位。

比如:1999 年、2000 年 ...,這是用 4 位十進位制表示。

當到了 9999 年,再過一年,你如果還用 4 位表示,就會溢位了。

9樓:解騫

所謂溢位是指資料的大小超出了編碼的表數範同圍。例如字長為8,補碼的表數範圍是-128d(1000 0000b)至+127d

(0111 1111b)。現有兩數求和127+1。按補碼運算為0111 1111+0000 0001=1000 0000

補碼1000 0000b的真值為-128d。而127+1的正確結果應該是+128,超出了表數範圍,溢位了。

10樓:做而論道

什麼是溢位?

溢位,是指資料的大小,超出了編碼所能表示的範圍。

不僅是補碼計算,任何形式的計算,都可能產生溢位。

比如: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)。

注意,此時的進位為 0,結果的符號錯誤,才是溢位的特徵。

在負數最小值(-128)再加-1,也會超出範圍,發生溢位。

計算如下:

1000 0000

+ 1111 1111

(1)0111 1111

得到的是正數(127)。

注意,此時的進位為 1,並無意義。

結果的符號錯誤,才是溢位的特徵。

因為「帶符號數」運算髮生溢位,必定是結果超出範圍。

所以,只有如下四種運算,才有可能出現溢位:

正數+正數、負數+負數、正數-負數、負數-正數。

「帶符號數」的溢位,與進位並無關係。

溢位的特徵是:運算結果的符號,與正常結果相反。

判斷是否溢位的方法

由人工計算:就可根據符號位來判斷,如:

正+正,出現負的結果;

負+負,出現正的結果;

發生上述四種之一,就是溢位。

也可考查進位與次高位的進位,兩者不同,就是溢位。

用 cpu 計算:它就能自動判斷,如果發生溢位則會令 of=1。

負數在計算機中是用補碼錶示嗎?為什麼?我是新手,請大神指點,謝謝

是的。補碼最大的好處是可以把減法運算等同於加法運算。這樣在alu中只需要包含加法運算電路即可,大大簡化了cpu的電路結構。計算機中,只用補碼錶示正負數。在計算機中,並不存在原碼反碼。求補碼,也有更簡單的方法,也用不著原碼反碼。所以,原碼反碼,都沒有任何用處。以八位碼長,來說明計算機中的補碼 數字 0...

C運算子過載為什麼流運算子不能過載為成員函式

class object如果實現了成員operator 呼叫其物件格式o 載運算子為成員函式後,當呼叫該運算子時,左運算元必須是該類的例項。友元函式 流引數定義第一個引數.才能呼叫cout 雖然不能 過載 為成員函式,但是可以定義為新的成員函式,只不過使用習慣和常例不符而已。試想一下這一點 將我們的...

為什么會這樣,為什麼會這樣

你可以試圖啟發啟發她,看看她有沒有悔改之心。我以前也有個朋友,跟她做了10年的同學,後來也幾乎變了。但是其實她也是有原因的,可以試著瞭解她。如果她真的沒有悔改之心,那也只能怪你自己交友不慎 你應該和她做朋友,不過你要勸她不要再去和那些人交往了,不然的話她會學了那群人的壞習慣的.可以和她做朋友的,嘗試...