数据的表示和运算
"自六月份另一个学校毕业 已经有拖三个多月的计组学习 当时其实已经已有一些学习 仅仅差了一节内容结束 也确实因为这个复杂的运算各类东西 言归正传 新的学校 新的学习 开始总结"
先看一下总的
还是分为三大块 三步走
一.数制 编码
先说数制 其实就是各类进制及其转换
- 二进制 B
- 十进制 D
- 八进制 O
- 十六进制 H(Ox)
首先说点废话:计算机采用二进制(0和1) 两个稳定状态的物理器件
至于各种进制就是逢几进一
两道类型结束 数制
1.二进制和十进制转换
二进制转换十进制:
很简单 如1111.11(二进制)转换为15.75(十进制)
同样的十进制转换二进制 则是转过来
如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方法
如1111000010.01101
相反八进制 十六进制转换二进制就是把每个拆分出来
需要注意的就是划分的时候 整数从右向左 小数部分从左向右
还有就是十六进制超过10以后 有专门字母代替
A(10) B(11) C(12) D(13) E(14) F(15)
再看编码
之前是属于参加过考试比较容易掌握的计算机基础知识
接下来编码
我认为就是两个知识点
- 原反补移码
- 整数之间的转换
1.原反补移码
两个概念:
真值: +15 -8 带+ -符号的数
机器数:符号数字化 如0100 原反补码
移码:常用于表示浮点数的阶码 只能表示整数
总体来看不再一一分开
0的表示 原码 反码表示不唯一
正数的原反补码一样
整数用补码表示
取值范围
一道题来变化弄懂原反补移码的变换:
如求原码-42 的反 补 移码
2.整数
有符号整数和无符号整数
正常例如写的C语句中 int a=5;默认是有符号的 无符号修饰为unsigned
有个小注意:unsigned a =5; 默认为int型
整数之间的转换:符号 字长
- 有无符号整数之间的转换
- 不同字长整数之间的转换
#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);
}
大致第一块的内容知识 然后接下来看一些题目
8位原码能表示的不同数据有多少个
若寄存器内容10000000 若它等于-0 则为什么码
首先排除补移码 因为它们0表示唯一 不区分+ -
然后看是原码还是反码
在计算机中,通常用来表示主存地址的是 无符号数
16位补码整数0x8FA0扩展为32位应该是
小总结 对于负数比较 补码比较则是绝对值的比较 原码则是那个数的比较
二.运算
- 运算部件
- 移位运算
- 加减乘除运算
1.运算部件
之前总结过的运算器的组成:
https://www.cnblogs.com/gaodiyuanjin/p/18800302
ALU:算数逻辑单元
ACC:累加器
MQ:乘商寄存器
X:操作数寄存器
核心就是ALU的(带标志)加法器 之前我们需要搞懂几个东西 我简单介绍 然后一个总结
与 或 非 与非 或非 异或 同或
这些我们了解的用门电路图表示出来
与
或
非
与非 (就是先与 再非)
或非 (先或 再非)
异或 (没什么特殊的 跟或一样 除了 1 1为0)
同或 (跟与一样 除了 0 0为1 )
概述总结图:
多路选择器
还有一个比较重要的新知识 拥有标志的加法器
- OF 溢出标志
- SF 符号标志
- ZF 零标志
- CF 进位/错位标志
OF=1 表溢出(有符号)
SF=0 结果为正
ZF=1 结果为0
CF=1 表溢出(无符号)
2.移位运算
逻辑移位(无符号整数) 无论左移或右移 都补0
算术移位 左移 补0 右移 补符号位
很抽象 做题弄明白
补码定点整数10010101 右移一位后的值
一般指的就是算术移位
2018统考题 整数X的机器数为 1101 1000 分别对X进行逻辑右移1位和算数右移1位操作操作 得到的机器数各是
那发生移位 肯定会伴随溢出问题
逻辑移位:只要高位的1移出 则溢出
算术移位:
左移 前后符号位变化 溢出
右移 低位1移出 丢失精度
3. 加减乘除运算
三步走 运算规则 溢出 运算电路
- 加减
[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需要先取反 然后+1 变成1100 再相加
需要注意Sub为0时做加法 为1时做减法
无符号数大小比较:(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
使用加法和移位运算实现
被除数与除数 同号减法 异号加法
余数与除数补码 同号上商1 异号上商0
除:A=-0.1001 B=0.1101
至于数值运算:
参考deepseek
直接看真正需要掌握的题目类型
算数逻辑单元(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 非0 非数
那么如何考察呢 就是IEEE754数的转换
将十进制数-8.25转换成IEEE754单精度浮点数格式表示
IEEE754单精度浮点数C6400000H的值
注意:IEEE754规定隐藏位1的位置在小数点之前 需要隐藏 这就是上面第一个求尾数的时候 将1隐藏 第二个求尾数的时候 将1还原出来
阶码越大 表示的数范围越大 尾数越多 精度越高
浮点数加减运算 对阶
左规和右规
左规和右规都有可能产生溢出
数据大小端和对齐存储
先弄清楚几个概念
LSB最低有效字节 表示数据的低位
MSB最高有效字节 表示数据的高位大端对齐:从高位到低位 字节顺序和原序列相同
小端对齐:从低位到高位 字节顺序和原序列相反
关于边界对齐方式存储和之前学的C语言中结构体共用体对齐一致
参考:https://www.cnblogs.com/gaodiyuanjin/p/18405937
最后一节的题目来看:
一道同类型题目
尾数规格化:
原码:最高有效位为1
正:0.1XXX
负:1.1XXX补码:小数点后一位和符号位不同
单精度浮点数 原码 补码 移码的32位机器数均为0xF0000000 从大到小顺序
移>补>原>浮
上面总结过 小阶向大阶对齐 E差多少 就右移多少
大小端对齐题目
边界对齐问题
大致这是第二章总结 应该是目前我总结写过最长的博客
下一章存储系统 再见