前言
博主已经有一周没有更新了==,博主来力^^。
我们先来整理一下思路
数据分为
- 数值型
- 浮点数(实数)
- 整数
- 无符号型
- 有符号型
- 非数值型
- 字符型
- 逻辑数据
- 图形 声音 图像
第一部分 编码
我们先来了解一下编码,原补反码的知识链接在此~需要自取^^(这部分知识也很重要)
1.整数的表示
下表表示了一些数据类型能表示的最值
观察可知,
- char数据可视为整数 只有一个字节
- 最小值和最大值的绝对值差一
- 无符号数无最小值
2. 二进制编码、无符号数和有符号数 定义
** 假设一个整数数据有w位,其二进制编码可以用w维向量表示(如下图)xi就是数位i上的0或1
- 这是无符号数编码的定义
可见B2U(binary to unsigned)是一个二进制转无符号数的函数
看不懂没关系,我们看例子~
- 有符号数编码(补码,记住补码就是有符号数编码!!!)
符号取决于最高位,所以如果这个数开头是1就说明是负数^^(C++课应该也会碰到捏)
同样看个例子
- 常见无符号数有符号数编码
观察可知- 有符号数和无符号数的非负值编码相同
- 每个编码都表示唯一的整数值
- 可以反向映射
3. 将整数转换为补码
(仅限应用于可在编码表示范围内的数字)
-
如果该数字值非负 (If nonnegative),补码等于该值对应的二进制数(位长不足补0)
-
否则,其绝对值的二进制数逐位取反,并加1,符号位置1
belike
4.可表示的整数范围
这个就是数据表示最值的原理嘞
即(U无符号 T有符号)
5.其他的编码方式
-
反码
- 和补码的定义类似,区别是符号位的权重为(括号内多了一个负一)
-
原码
- 和补码的区别是,符号位的作用仅用于决定其他位的位权为正/负(不影响数值大小)
第二部分 变换
一、有符号数与无符号数
1.有符号数转无符号数
可以利用强制转型
- 注意:编码本身没有发生变化
- 负数转换为一个(大)整数
转换规律如下(w为位数)
2.无符号数转有符号数
编码依旧不变
运算规则如下
从下图可以形象的看出特殊的情况(0和最大形式值,他们自身之间是相互对应的)
3.C语言中的有符号数和无符号数
- 以下是常量的情况
- 缺省情况下,所有的整数常量都是有符号数
- 如果需要声明无符号数常量,需要增加一个后缀 “U”
- 转换
- 显式转换(即强制转型)
- 隐式转换(即不同数据类型间的赋值)
- 表达式求值
- 混用无符号数和有符号数时,有符号数会被隐式转换成无符号数
- 混用无符号数和有符号数时,有符号数会被隐式转换成无符号数
二、扩展与截断
1.位扩展
- 无符号数:零扩展
- 扩展后最高位的空位补0
- 有符号数:符号位扩展
- 扩展后最高位的空位原编码的符号位
belike(即符号位是什么数字就补什么数字)
- 扩展后最高位的空位原编码的符号位
2.数字截断
多余的位被直接丢弃(从最高位开始),belike
3.使用无符号数的情况
- 位向量
- 掩码
- 地址
- 高精度计算
第三部分 运算
1.加法
无符号数的加法规则
丢弃进位位等价于进行一次取模运算
即
表达成分段函数即
belike
有符号数加法
- 真实和共w+1位
- 丢弃最高位
- 将计算结果视为补码编码
- 和截断
- 如果大于等于2 w-1 ,变为负数
- 如果小于–2 w –1 ,变为正数
POSOver和NegOver分别是正溢出和负溢出
补充:阿贝尔群((可交换群、加群)
-
具有封闭的加法运算
-
交换律
-
结合律
-
具有唯一的0元素
-
每个元素都有补元素
2.有符号数的相反数
- 使用取反和加法运算求相反数
~x + 1 == -x
3.乘法
范围
- 无符号数最多2w位
- 有符号数最小值最多2w-1位
- 有符号数最大值最多2w位
无符号数乘法
- 等价的模运算实现
4.使用移位运算实现2的幂的乘法和除法
使用移位实现乘以2的幂
- 左移即乘
- 同时适用于有符号数和无符号数
使用移位实现有符号数除以2的幂
- 右移即除
在大多数计算机上移位运算和加法运算比乘法运算快得多 - 当u<0时会出现取整方向的错误
- 修正:当u<0时,为 u 加上2 k -1
- 由于要对其取模,相当于最终结果加1
补充 需要记忆的点
-
常见无符号数有符号数编码
-
请记住2的零次方到十次方^^
-
一些重要的数字
请记住-1和0!!!
- 有符号数-1的补码和U max 的编码相同
- 0 的编码方式都相同,编码所有的位都为0
ending
就这样,我们下期再见^^