2 3 整數計算

2022-07-10 03:06:09 字數 1866 閱讀 3184

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,...