其他进制视作Vetor表示法
我们将表示和代表的数字分离, EveryThing Base on Dec
数的十进制表示我们也称 “数本身” , 所有数的表示我们都默认以十进制表示
数的其他进制表示我们视作向量 的一种缩写
我们接下来研究数的进制
快捷记忆: 基数为2的等比数列求和需要记忆
Unsigned Encoding 无符号数编码
则有 Binay Codeing to Number using Unsigned Decoding 函数
范围
Two’s-Complement Signed Encoding有符号数
采用补码(two’s-complement)编码形式
即 Binay Codeing to Number using Complement Decoding
范围
相当于 二进制编码 所对应的 向量串
相当于, 用补码规则转换到正常数
Relate Opreate
Shift Operation in C
左移: C语言中都是指逻辑左移, 均补0
逻辑右移: 统一补0
算数右移: 根据符号位决定补1还是补0
C语言中, 虽然没有明确规定有符号数使用哪种右移几
但是几乎所有的编译器都是对有符号使用算数右移, 无符号逻辑右移
Transfer Rule
小类型 → 大类型:
对于Signed , 高位根据符号位1或0 扩展
证明: 比较 和 做差
大类型 → 小类型
对于Unsigned , 截断高位保留低位 ,等效取模运算
对于Signed: 等价于先视作无符数截断,使用 之后再使用 转换
Implicit Transfer
Exmaple Code
int a = -1;
unsigned int b = 0;
if(a<b)
printf("-1<0");
if(a>b)
printf("-1>0");
Copy
C++
C语言会隐式的把有符号转换成无符号表示
Transfer Funtion
对于同样的Binary Code , 不同Decoding 结果差
上述的结果是用Binary Code的信息作为参数表述
如果使用Decoding 后的结果, 来表示转换的话则有
T2U U2T
对于同样的二进制表示Vector,
已经转换成一种编码方式, 切换成另一种编码方式, 所带来的数的差异
Interger Arithmetic
无符号加法
无符号加法定义
我们称 所对应的情况为溢出
表示: 我们记作 以避免重载带来的歧义
上标 表示无符号数, 下标 表示编码位数
无符号判定溢出
方法:
如果发生了溢出, 我们有溢出结果 小于原来两个数中任何一个数
证明
若有
最后一个条件显然成立, 故原命题成立
代码实现: return x+y>x 1为无溢出, 0为溢出
有符号加法
有符号加法定义
我们表示成: , 其中 代表互补
注意: 溢出后, 我们还是增减 而不是增减
溢出判断
当两个正数相加 , 得到负数, 代表正溢出
当两个负数相加 , 得到正数, 代表负溢出
无符号减法
何为逆元: 满足 即可
对于无符号数正数而言,通过正溢出:
固有如下运算定义
有符号减法
固有如下运算定义
分析
由于补码正数负数的范围非对称, 其最小值 无直接对应的正数逆元
故我们需要通过负溢出计算出在这个范围下的逆元
则有 确定触发负溢出条件 , 解得的逆元为本身
无符号乘法
不截取的时候, z应该为 位, 我们取余相当于截取