补码正确性的证明
来源:互联网 发布:破解三星s4支持4g网络 编辑:程序博客网 时间:2024/06/09 06:33
虽然不知道大牛怎么想到这样解决补码的正负表示问题1,但这种解决办法的正确性倒是可以尝试证明一下。
首先需要明确什么叫正确性,充要条件暂时没有想到,先列举几个必要条件,至少这些条件需要能成立:
- 本身的值表示正确
- 本身的符号表示正确
- 运算结果的值表示正确
- 运算结果的符号表示正确
接下来证明每一个条件:
本身的值表示正确、运算结果的值表示正确
一定正确,左边加一位对值来说是完全不影响的,可以从两个角度分析
- 左边加1就等于加了一个模
- 左边是高位,本身的运算只会向高位进位,完全不会影响低位的运算
本身的符号表示正确
只要用这个符号系统表示,就会自然正确
运算结果的符号表示正确
没想到好办法,只能分情况讨论。
- 假设一个具体的情形方便举例:4位二进制,1位符号位,模是8,使用补码的表示范围是
-8~7
。 - 另外把数学数字运算的结果称为「数学结果」,把通过这种位算法运算的结果称为「位运算结果」,这两个结果的符号一致就表示正确。
- 根据符号位是否会受值位运算的结果影响分为两大类,其中又根据具体情况细分。
1)值的位运算不溢出
- 两个正数
符号一致
- 数学结果:两个正数相加还是正数,符号一定为正
- 位运算结果:因为值的位运算不溢出,两个0相加还是0,也就是正
- 两个负数
情况不存在
- 数学结果:符号一定为负
- 位运算结果:值的位运算不溢出,两个1相加进一位得到0,也就是正
- 看起来两个结果的符号一定不一致。但其实可以证明这种「值的位运算不溢出」情况下「数学运算结果一定溢出」,而数学运算结果溢出的情况不用考虑,我们不保证这种情况下运算结果的正确性
- 证明:
- 假设负数A的补码表示是
[1a1a2a3] ,它的数学大小=−8+(a1∗22+a2∗2+a3) ,设右侧为A ,那么数学大小=−8+A - 假设负数B的补码表示是
[1b1b2b3] ,它的数学大小=−8+(b1∗22+b2∗2+b3) ,设右侧为B ,那么数学大小=−8+B - 那么“值的位运算不溢出”这个条件用数学表示就是
A+B<8 - 这时候计算数学运算结果:
−8+A−8+B=−16+A+B ,因为A+B<8 ,所以这个结果一定小于−8 ,而它的表示范围是−8 7 ,所以溢出了
- 假设负数A的补码表示是
- 一正一负
- 正数绝对值大于负数
情况不存在
- 数学结果:正
- 位运算结果:0和1相加得到1,也就是负
- 虽然结果不一致,但是可以证明这种情况不存在,也就是「正数绝对值大于负数」时「值的位运算一定溢出」
- 证明:
- 假设正数A的补码表示是
[0a1a2a3] ,它的数学大小=a1∗22+a2∗2+a3=A - 假设负数B的补码表示是
[1b1b2b3] ,它的数学大小=−8+(b1∗22+b2∗2+b3)=−8+B - 「正数绝对值大于负数」的数学表示是
A−8+B>0⇒A+B>8 - 「值的位运算」结果为
A+B ,它一定大于8就说明溢出了
- 假设正数A的补码表示是
- 正数绝对值小于负数
符号一致
- 数学结果:负
- 位运算结果:0和1相加得到1,也就是负
- 正数绝对值等于负数
情况不存在
- 位运算结果需要是0,而如果值位不溢出,符号一定为负,其实通过「正数绝对值大于负数」这个证明可能看出,正数绝对值等于负数时值位也一定溢出
- 正数绝对值大于负数
2)值的位运算溢出
- 两个正数
情况不存在
- 两个正数的值位运算溢出意味着运算结果大于8,意味着数学运算结果溢出,不考虑
- 两个负数
符号一致
- 数学结果:一定是负的
- 位运算结果:两个1相加是0,但是有进位,如果进位为1就没问题,那进位会不会是2呢?不会,因为后三位最大是7,两个7是14,不超过16,所以结果也是负数
- 一正一负
- 正数绝对值大于等于负数
符号一致
- 数学结果:正
- 位运算结果:0和1相加得到1,溢出1位得到0,也就是正
- 正数绝对值小于负数
情况不存在
- 数学结果:负
- 位运算结果同上,为正
- 但这种情况不存在,也就是「正数绝对值小于负数」一定不「值的位运算溢出」
- 证明
- 假设正数A的补码表示是
[0a1a2a3] ,它的数学大小=a1∗22+a2∗2+a3=A - 假设负数B的补码表示是
[1b1b2b3] ,它的数学大小=−8+(b1∗22+b2∗2+b3)=−8+B - 「正数绝对值小于负数」数学表示是
A−8+B<0⇒A+B<8 ,说明值的位运算一定不溢出
- 假设正数A的补码表示是
- 正数绝对值大于等于负数
总结以上对于「运算结果的符号表示正确」的证明,所有存在的情况中,符号都是一致的,所以运算结果的符号表示也是正确的。
结论
综上所述,4个条件均成立,所以从目前来看,补码的正确性是可以保证的。
- 见计算机中整数为什么以「补码」的形式存储? ↩
阅读全文
0 0
- 补码正确性的证明
- krusal算法正确性的证明
- 如何证明程序的正确性?
- 树状数组正确性的证明、、、
- 【笔记】程序正确性的证明
- 证明Fesitel 结构的正确性
- 关于AC自动机的正确性的证明
- 全排列算法的正确性证明
- 哈夫曼树构造算法的正确性证明
- 关于补码原理的证明
- 算法正确性证明三要素
- 贪心算法正确性证明
- 关于dijkstra的贪心思想的正确性的证明
- 最小生成树的prim算法贪心正确性的证明
- 关于最大流增广路径算法的正确性的证明
- 最小生成树的prim算法贪心正确性的证明
- 用归纳法证明循环不变式的正确性。
- 用循环不变式证明RB-INSERT-FIXUP的正确性
- 尝试自己写一个工具类实现UGUI的按钮功能
- zabbix3.X配置邮件监控
- http如何像tcp一样实时的收消息?
- Python正则表达式指南
- 第三方TabLayout的静态动态使用 和Viewpage一起使用
- 补码正确性的证明
- 从Toast显示原理初窥Android窗口管理
- 自动行为操控Steering(九)—徘徊(单体操控)
- 【CodeForces 626E】Simple Skewness (三分)
- 大学英语单词L
- UNP
- 欢迎大家走进我的园子 目录整理篇
- python异常记录
- ggplot2之Layer—— geoms(三)