這一節包括定點數的表示和運算:
無符号數:
其實c語言都學了

1-2的負2次方其實就是當k-1=1=k-2=1 這時候 是0.5+0.25=0.75
下面學習有符号數的相關表示法
原碼:
很好懂
補碼:
如果 我們想把1011變成0000 我們首先可以讓1011-1011
但是在計算機内部 還有一種思路 我們想把減法變成加法 如果 寄存器是4位 那麼從右往左數第五位一定會背舍去
根據這個思路
我們可以讓1011加上它的補數 得到10000 到時寄存器自然舍去這個1
補碼求原碼還是按位取反再加一
小數也是按位取反再加一:
補碼的運算:
還是電子科大的課件講的詳細 吹一波
反碼就是按位取反:
移碼:
不懂這個課件怎麼搞的 按理說不應該是2的n-1次方麼 可能這個n不算符号位吧那就
看看人家電子科大的:
就是2的n-1次方啊 誰會蠢到用n像王道考研一樣表示總位數-1????
補碼符号位取反就變成了移碼
這個移碼講的很清楚:
回顧一下定點數的表示:
下面進入定點數的運算;
紅色的是考試重點
移位運算:
位運算 太簡單了
算術移位:
很簡單
循環移位 考試不怎麼考 了解就好 但是在密碼學什麼的應用還是有的:
加減運算:
加減我們統一為求補碼再相加
我們可以先求原碼再填充0再求補碼
也可以先求補碼再填0
這個原碼怎麼加減還是沒說啊 我是服了 實際上有符号數的原碼加減運算需要細講一下的啊
看一下電子科大的課件:
一看就懂了...
來個例子更懂了:
香
不過這個例題沒有包含最高位有進位的情況 還有就是這些情況大不了考試轉化為十進制再算 沒人會管我是怎麼算出的 幹嘛非用補碼
這個是移碼的加減運算:
來看看例子:
這個-7的移碼怎麼算的呢 我覺得是這樣:
-7 = 1111 移碼是要1111+ 01000 需要給1000前邊一個0這個符号位 也就是1000-111這個運算 結果為 0001 這個方法是二進制的減法
用補碼解釋:
1000 -0111=1000+1001=0001
實際上十進制來做題 就是8-7 =1=0001
我上述用了三種方法 實際做題我推薦直接一眼看出十進制然後就這麼計算 也好了解 也不可能錯 (國小10以内加減法罷了)
溢出判斷:
第一種方法 如果發生溢出 符号位會變化;
剩下的判斷方法:
下面看看乘法:
乘法不是重點 可能因為計算太麻煩
王道講的還是不全面 因為還需要一個寄存器存放被乘數 不能光ACC和MQ兩個寄存器 我們計算每次累加要麼加0要麼加被乘數的 而且值得注意的是 這個原碼一位乘法 在計算機内部是兩位符号位這麼算的
也就是00表示正,11表示負
對比下電子科大:
過程很明白 箭頭是右移
如果是手工算 就跟十進制差不多 注意一下符号位隻表示正負
如果是計算機算(像右側一樣)
如果MQ最後一位是1 加上原值 如果是0 加0
然後ACC和MQ都右移 然後這樣疊代計算
直到MQ都移出了如題目中的1011 這個還是很好了解的
但是
補碼一位乘法: 這個講的根本不是很好 迷迷糊糊 小數點莫名其妙 符号位也莫名其妙 最後算法的結束講的也不清楚
問題太多就比如
為什麼機器字長是五位(包括一位符号位) 最後ACC和MQ這些寄存器成了6位的???
x是-0.1101 有符号位 那麼填一個符号位 x是11.1101這個沒問題吧 x和-x的補碼也沒問題 可為什麼到了y這裡 y是正的0.1011 然後y的補碼是它本身 不需要添符号位 y是00.1011麼?
最後MQ存的為什麼是010110?
為什麼把0110移出去之後就停止運算?
為什麼最後結果舍去後兩位 隻要ACC和MQ的前四位:
為什麼得到這個結果小數點不明不白?
我哪知道小數點要加在哪裡?最後還是發現擺脫不了念PPT
估計本身講課的人也不懂 還需要自己以後大複習查漏補缺的時候去探究,就很煩
補碼一位乘法現在還是不太會 但是我想先學完全部再回過頭抓難點
乘法運算總結回顧:
然後看一下除法:
手工計算的話:本身就是除不盡的 機器字長五位 我們就保留住五位不除了
如果是計算機算的話:
首先 舉個例子 24÷8=3,其中24是被除數,公式是被除數÷除數=商 我經常忘 因為國小老師也教得不好 而且記住這個也沒意思
我們要想除以一個數 肯定是一般被除數要大于除數 我們一目測比較最高位就看出來了 但是計算機不能這麼目測(或者說底層那些原件的實作不能這樣 确實可以寫一下相關算法 依次去取最高位來比較除數和被除數大小)
計算機更簡單粗暴是 我讓被除數的絕對值減去除數的絕對值 (因為要考慮正負 也就是符号位)如果這個內插補點 大于0 說明被除數天生就比除數大 因為是二進制除法 我們需要商1 如果
這個內插補點小于0 也就是被除數天生小于除數 我們就商0 除不夠 然後再左移補0疊代下來接着除
而用到的這個判斷方法需要減法 計算機的減法其實是加他的的補碼再舍去溢出位 是以要求出補碼
而我們進行減數這個判斷除數和被除數大小時(也就是加補碼) 寄存器存儲了結果 我們需要把結果再還原 是以我們又要加上正的數的補碼來還原 這個就是“原碼恢複”
這其中我們想“恢複”的次數不固定 我們不知道什麼時候要商0
然後我們通過代數學 得到了不用恢複的辦法:
然後計算機内部是這樣
我就納了悶了 上次也是機器字長五位 這次也是機器字長五位 上次寄存器6位 這次你給整個5位?什麼意思 到底會不會...到底哪個對...怪不得每年都有這麼多考研專業課過不了百的
這就像考研不挂科的猴博士一樣 永遠隻教固定的套路 如果不清楚原理 題目靈活一點 一樣也什麼不會的
那個小數點 結果什麼的 到現在我也迷迷糊糊 聽完這節課之後我就去淘寶買了課本 而且這種課例子太少了 就這麼一種情況 改天考試出個負數除正數什麼的 不就又傻眼了麼
不懂原理不了解 隻按照這種輔導機構的套路做題 真的害人不淺的 我以為能把原理什麼的講的方方面面很全面 其實最後還要自己吃透課本去了解
這也能側面說明這些考驗網課動辄幾千價位 其實很不值得 即使花這麼多錢也不會講的多清楚 幸好b站這個是免費的 我從沒花錢買這些網課
這個的符号位不參與運算
下面講的這個符号位參與運算:
總結;
強制類型轉換 講的還可以:
無符号數和有符号數的轉換就是原本的内容都不變 符号位的意義會改變 是以真值也會可能變
長整數變短整數 就是比如4位元組變為2位元組 最高位的那兩個位元組直接截斷不要 剩下兩個位元組作為short型
短整數變為長整數是符号位的擴充 填充使得位數邊長
但是其實int也不一定非要是4位元組 這個是看編譯器的...總有人說int4位元組 其實都是不嚴謹的說法