數據的表示和運算
"自六(liu)月(yue)份(fen)另一個學校畢業 已經有拖三(san)個多(duo)月(yue)的(de)(de)計組學習 當時其實已經已有一些學習 僅(jin)僅(jin)差了一節內容結(jie)束 也確(que)實因為這(zhe)個復(fu)雜的(de)(de)運算各類(lei)東西 言(yan)歸正傳 新(xin)的(de)(de)學校 新(xin)的(de)(de)學習 開始總結(jie)"
先看一下總的
還(huan)是分(fen)為三大塊 三步走
一.數制 編碼
先(xian)說數(shu)制 其實(shi)就是各類進制及其轉換(huan)
- 二進制 B
- 十進制 D
- 八進制 O
- 十六進制 H(Ox)
首先說點廢話:計算機采用二進制(0和1) 兩個穩定狀態的物理器件
至于各種進(jin)制就是逢幾進(jin)一
兩道類型結束 數制
1.二進制和十進制轉換
二進制轉換十進制:
很簡(jian)單 如1111.11(二進制(zhi))轉換為15.75(十進制(zhi))
同樣的十進制轉換二進制 則是轉過來
如15.75(十進制)轉換為1111.11(二進制)
十變二
整數部分就一直除于二 取余數 直到1(從下到上)
小數部分就一直乘2 取整數 直到1(從上到下)
二變十
知道一個常見的就行
128 64 32 16 8 4 2 1對應二的幾次方
7 6 5 4 3 2 1 0
2.二進制和八進制 十六進制轉換
二進制轉換其八進制和十六進制
對于 421 和 8421方(fang)法
如1111000010.01101
相反八進制(zhi)(zhi) 十六進制(zhi)(zhi)轉換二(er)進制(zhi)(zhi)就是(shi)把每個拆分出來
需要注意的就是劃分的時候 整數從右向左 小數部分從左向右
還有就是十六進制超過10以后 有專門字母代替
A(10) B(11) C(12) D(13) E(14) F(15)
再看編碼
之前是屬于參加過考試比較容易掌握的計算機基礎知識
接下來編碼
我認為就是(shi)兩個知識點(dian)
- 原反補移碼
- 整數之間的轉換
1.原反補移碼
兩個概念:
真值: +15 -8 帶+ -符號的數
機器數:符號數字化 如0100 原反補碼
移碼:常用于表示浮點數的階碼 只能表示整數
總體(ti)來看(kan)不(bu)再一一分(fen)開
0的表示 原碼 反碼表示不唯一
正數的原反補碼一樣
整數用補碼表示
取值范圍
一(yi)道題來變(bian)化弄(nong)懂原反補(bu)移碼的(de)變(bian)換:
如求原碼-42 的反 補 移碼
2.整數
有符號(hao)整數和(he)無符號(hao)整數
正(zheng)常例如寫的C語句中 int a=5;默(mo)認(ren)是(shi)有符號的 無(wu)符號修飾為unsigned
有(you)個小注意:unsigned a =5; 默認(ren)為int型
整(zheng)數之(zhi)間(jian)的轉換:符號(hao) 字長
- 有無符號整數之間的轉換
- 不同字長整數之間的轉換
#include <stdio.h>
int main(void) {
short a = -4321;
unsigned short b = (unsigned short) a;
printf("%u", b);
}
-4321轉換成無符號 字長并未改變
先求出其補碼 然后其符號位不再是符號而是數值

不同字節整數之間的轉換:
長 -> 短 截高位
短 -> 長 有符號 高位補1 無符號 高位補0
例如: 長 -> 短
#include <stdio.h>
int main(void) {
int a = -34991;
short b = (short) a;
printf("%d", b);
}

短 -> 長
#include <stdio.h>
int main(void) {
short a = -4321;
int b = a; //有符號短 -> 長
unsigned short c = (unsigned short) a;
unsigned int d = c; //無符號 短 -> 長
printf("%u\n %u", b, d);
}


大(da)致第一塊的內容知識(shi) 然后接(jie)下來看(kan)一些題目
8位原碼能表示的不同數據有多少個

若寄存器內容10000000 若它等于-0 則為什么碼
首先排除補移碼 因為它們0表示唯一 不區分+ -
然后看是原碼還是反碼
在計算機中,通常用(yong)來表示主存(cun)地址的是 無符號數
16位補碼整數0x8FA0擴展為32位應該是


小總結(jie) 對(dui)于負數比(bi)較(jiao) 補碼比(bi)較(jiao)則是絕對(dui)值(zhi)的(de)比(bi)較(jiao) 原碼則是那個數的(de)比(bi)較(jiao)
二.運算
- 運算部件
- 移位運算
- 加減乘除運算
1.運算部件
之前總結過(guo)的運(yun)算(suan)器的組成:
//ywjunkang.com/gaodiyuanjin/p/18800302
ALU:算數邏輯單元
ACC:累加器
MQ:乘商寄存器
X:操作數寄存器
核心就是ALU的(de)(帶(dai)標志)加法器(qi) 之前我們需要(yao)搞(gao)懂幾(ji)個東西(xi) 我簡(jian)單介紹 然(ran)后一個總結
與 或 非 與非 或非 異或 同或
這些我們了解的用門電路圖表示出來
與
或
非
與非 (就是先與 再非)
或非 (先或 再非)
異或 (沒什么特殊的 跟或一樣 除了 1 1為0)
同或 (跟與一樣 除了 0 0為1 )
概述總結圖:

多路選擇器
還有一個(ge)比較重要的(de)新知識(shi) 擁有標志的(de)加法(fa)器
- OF 溢出標志
- SF 符號標志
- ZF 零標志
- CF 進位/錯位標志
OF=1 表溢出(有符號)
SF=0 結果為正
ZF=1 結果為0
CF=1 表溢出(無符號)
2.移位運算
邏輯移位(無符號整數) 無論左移或右移 都補0
算術移位 左移 補0 右移 補符號位
很抽象 做題弄明白
補碼定點整數10010101 右移一位后的值
一般指的(de)就是算術移位
2018統考題 整數X的機器數為 1101 1000 分別對X進行邏輯右移1位和算數右移1位操作操作 得到的機器數各是
那發(fa)生(sheng)移位 肯(ken)定(ding)會伴隨溢出問(wen)題
邏輯移位:只要高位的1移出 則溢出
算術移位:
左移 前后符號位變化 溢出
右移 低位1移出 丟失精度
3. 加減乘除運算
三步走 運(yun)算(suan)(suan)規則 溢出 運(yun)算(suan)(suan)電路
- 加減
[A+B]補=[A]補+[B]補
[A-B]補=[A]補+[-B]補
需要注意的就是減法當成加法運算
還有就是運算出來的符號位 要相應變化
設字長為8位 A=15,B=24,求[A+B]補 [A-B]補
溢出判斷:
正+正=1符號位 得到負數溢出
負-正=0符號位 得到正數溢出
一位符號位:操作的兩個數符號相同 結果與原來不同 結果溢出
雙位符號位(運算結果為兩個符號位ab):
ab=00 正數 無溢出
ab=01 正溢出
ab=10 負溢出
ab=11 負數 無溢出
最高位進位和符號位進位相同 則無溢出
運算電路:
例如此電路 假設 X 0011 Y 0100
如果做加法 直接相加
若做減法 Y需(xu)要先(xian)取反 然(ran)后(hou)+1 變(bian)成1100 再(zai)相(xiang)加
需要注(zhu)意Sub為0時做加(jia)法(fa) 為1時做減法(fa)
無符號數大小比較:(ZF零標志 CF進/借位標志)
A=B ZF=1 CF=0
A>B ZF=0 CF=0
A<B ZF=0 CF=1
有符號數大小比較:(ZF零標志 OF溢出標志 SF符號標志)
A=B ZF=1
A>B OF=SF ZF=0
A<B OF不等于SF ZF=0
- 乘除
我認為這里更重要的是運算規則
乘除各用一道例題來學習 然后再用真實題目來理解
1.乘積的符號位由乘數符號位異或得到
2.乘積的數值位是兩個乘數的絕對值之積
乘:A=-15 B=-13 A·B
使(shi)用加(jia)法和移位(wei)運算實現
被除數與除數 同號減法 異號加法
余數與除數補碼 同號上商1 異號上商0
除:A=-0.1001 B=0.1101
至于數值運算:
參考deepseek
直接看真正(zheng)需要(yao)掌握的題目類型
算數邏輯單元(ALU)的功能一般包括 算術運算和邏輯運算
機器運算發生溢出的根本原因是寄存器的位數有限
原碼乘法先取操作數絕對值相乘 符號位單獨處理
原碼乘法符號位不參與運算
注意8位定點補碼表示的數據范圍為-128~127

需要注意 求[-啥]補碼時候 負數直接取反 正數求出原碼后取反
三.浮點數
不分總結了 直接上
一個重要的概念 IEEE754標準浮點數 基數都是2

尾數用原碼表示
單精度浮點數偏移值127 雙精度浮點數偏移值1023
表示范圍
階碼全為0或全為1時的特殊意義:
階碼 尾數
全0 全0 +0/-0
全0 非0 非規格化數 正數 2的-126次方(0.f) 負數 -2的-126次方(0.f)
全1 全0 +∞/-∞
全1 非(fei)0 非(fei)數
那(nei)么如(ru)何考察(cha)呢 就(jiu)是(shi)IEEE754數的轉換
將十進制數-8.25轉換成IEEE754單精度浮點數格式表示
IEEE754單精度浮點數C6400000H的值
注意:IEEE754規定(ding)隱(yin)藏(zang)位1的(de)(de)(de)位置在(zai)小數(shu)點之前 需要隱(yin)藏(zang) 這(zhe)就是上面第(di)一個(ge)求(qiu)尾數(shu)的(de)(de)(de)時(shi)候(hou) 將(jiang)1隱(yin)藏(zang) 第(di)二個(ge)求(qiu)尾數(shu)的(de)(de)(de)時(shi)候(hou) 將(jiang)1還原出(chu)來(lai)
階碼越大 表示的數范圍越大 尾數越多 精度越高
浮點數加減運算 對階
左規和右規
左規和右規都(dou)有(you)可(ke)能(neng)產生溢出(chu)
數據(ju)大小端和對齊存(cun)儲(chu)
先弄清楚幾個概念
LSB最低有效字節 表示數據的低位
MSB最高有效字節 表示數據的高位
大端對齊:從高位到低位 字節順序和原序列相同
小端對齊:從低位到高位 字節順序和原序列相反
關于邊界對齊方式存儲和之前學的C語言中結構體共用體對齊一致
參考://ywjunkang.com/gaodiyuanjin/p/18405937
最(zui)后一(yi)節的題目來看:
一道同類型題目
尾數規格化:
原碼:最高有效位為1
正:0.1XXX
負:1.1XXX
補碼:小數點后一位和符號位不同
單精度浮點數 原碼 補碼 移碼的32位機器數均為0xF0000000 從大到小順序
移>補(bu)>原>浮
上面(mian)總結過 小階向大階對齊 E差多(duo)少 就(jiu)右(you)移多(duo)少
大小端對齊題目
邊界對齊問題
大致這是第二章總結 應該是目前我總結寫過最長的博客
下一章存儲系統 再見




















































