2.3 整數計算
2.3.1 無符號加法
對於滿足\(0 \leq x,\quad y<2^w\)的整數\(x\)和\(y\)有:
\[x +_^ y=\begin x+y,\quad x + y < 2^w\\
x + y - 2^w,\quad 2^w\leq x+y < 2^ \end
\]檢測無符號數加法中的溢位
對在範圍\(0 \leq x,\quad y\leq umax_x\)中的\(x\)和\(y\),令\(s \dot x+_^y\)。則對計算結果s,當且僅當\(s < x\)(或者等價於\(s < y\))時,發生了溢位。
加法逆元
對於每個值\(x\),必然有其對應的加法逆元\(-_^x\)滿足\(-_^x +_^x=0\)。該加法的逆操作表述如下:
對滿足\(0\leq x < 2^w\)的任意\(x\),其\(w\)位的無符號逆元\(-_^x\)由下式給出:
\[-_^ x=\begin x,\quad x = 0\\
2^w - x,\quad x > 0 \end
\]對滿足\(-2^\leq x \leq 2^ - 1\)的任意\(x\),其\(w\)位的無符號逆元\(-_^x\)由下式給出:
\[-_^ x=\begin tmin_w,\quad x = tmin_w\\
- x,\quad x > tmin_w \end
\]2.3.2 補碼加法
對於滿足\(-2^\leq x,\quad y \leq 2^ - 1\)的整數\(x\)和\(y\)有:
\[x +_^ y=\begin x+y - 2^,\quad x + y > 2^ - 1 \qquad \textrm\\
x + y,\qquad -2^\leq x+y \leq 2^-1 \quad \textrm \\
x + y + 2^, \quad x + y < -2^ \textrm
\end
\]
兩個數的\(w\)位補碼之和與無符號數之和有相同的位級表示。檢測補碼加法中的溢位
對滿足\(tmin_w \leq x, y \leq tmax_w\)的\(x\)和\(y\),令\(s \dot x+_^y\),當且僅當\(x>0, y > 0\),但\(s \leq 0\)時,計算\(s\)發生了正溢位。當且僅當\(x < 0, y < 0\),但\(s \geq 0\)時,計算\(s\)發生了負溢位。
計算乙個位級表示的值的補碼非(加法逆元)的兩種便捷方法:
2.3.4 無符號乘法
對於滿足\(0 \leq x, y \leq umax_x\)的\(x\)和\(y\)有:
\[x*_w^uy=(x \cdot y)mod(2^w)
\]2.3.5 補碼乘法
對於滿足\(tmin_w \leq x, y \leq tmax_w\)的\(x\)和\(y\)有:
\[x*_w^ty=u2t_w((x \cdot y)mod(2^w))
\]
對於無符號和補碼乘法運算來說,乘法運算的位級表示都是一樣的。2.3.6 乘以常數
\[x<
\[x<
由於整數乘法比移位和加法的代價大得多,所以許多c語言編譯器試圖以移位、加法和減法的組合來消除很多整數乘以常數的情況。
2.3.7 除以2的冪
無符號數和補碼分別使用邏輯移位和算術移位來達到目的。整數除法總是向0方向捨入。
\[x>>k等價於\lfloor x/2^k \rfloor
\]\[(x+(1<>k等價於\lceil x/2^k \rceil
\]
超長整數加法計算
對於long long型別也存放不下的超長整數,可以使用字串模擬的辦法來對其進行運算的模擬。此處僅做加法的示範,其他運算思想類似。每四位視為乙個整數,進製等情況對下一次的計算考慮影響。includeusing namespace std define max len 50 int nnuma max...
大整數加法計算
普通數字的運算,我們可以直接運用已有型別int,long,long long等等計算,但要是數字非常大,這些型別是遠遠裝不下的。故而很多情況下需要我們自己來設定大整數運算,本篇記錄的是大整數的加法運算的方法。對於加法運算,第乙個方法是模擬手算。先來看看手算的步驟 手算的時候,我們會先把個位相加,有進...
筆記 整數計算溢位
讀 深入理解計算機系統 第二章 資訊的表示與處理 1 bool checkuaddoverflow unsigned int x,unsigned inty 2 1 bool checkaddoverflow int x,inty 2 910bool checkaddoverflow2 int x,...