阅读《C++Primer》的个人记录——2.1基本内置类型-关于浮点数补码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了阅读《C++Primer》的个人记录——2.1基本内置类型-关于浮点数补码相关的知识,希望对你有一定的参考价值。

学习第二章基本内置类型的过程中,对于书上描写的单精度浮点数和双精度浮点数的相关内容和补码的作用原理没弄清楚,经过查阅相关资料,整理如下:


现从简单的补码说起,
原码:正数的原码就是它的本身,负数用最高位是1表示负数
反码:正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反
补码:正数的补码和原码一样,负数的补码是负数的反码加1
【符号位在计算时直接参与运算】
原码缺点:0有两种表示,无法处理减法
反码:可以处理加减法及符号位,但0仍然有两种表示方式
补码:完美解决以上问题
逐条分析
原码加减法运算:略(很显然除了两正数相加其他都算不了)
反码加减法运算:
我们将符号位与绝对值分开讨论(数字形如&&&&&&&&)
设一个负数为-X,则其反码表示的数为-(128-x)
—————正数+负数
现假设一个运算为Y+(-X)【Y为正数】
符号位运算为0+1
绝对值运算为Y+128-X
此时若Y>=X则溢出一位至符号位得符号位为0,同时绝对值位运算结果为Y-X(>0),再将结果取原码得到符号位为0,绝对值位Y-X。符合预期
此时若Y<X则,将结果取原码的符号位为1,绝对值为128-(Y+128-X)=X-Y,符合预期
—————负数+负数
现假设一个运算为(-X1)+(-X2)
符号位运算为1+1=0
绝对值位运算为(256-X1-X2)
此时若X1+X2>128则将结果取原码的绝对值位X1+X2-128,符号位为0。显然得到的答案不正确,但此类情况对应着溢出情况。所以结果也符合预期
此时若X1+X2<=128则绝对值位溢出一位至符号位得符号位为1,绝对值位为128-X-Y。符合预期
综上,反码运算解决了符号位问题。
但0仍然有00000000和10000000两种表示方法

补码
1、先解释——减一个数等同于加其的补码
设一个负数的原码为X,反码为Y,补码为Z则
X+Y=11111111
Z=Y+1
的X+Z=100000000(1溢出)=00000000
故X=-Z
所以说采用补码,统一了加减法
2、再解释补码的加减运算
略(同反码类似)


浮点数:
https://www.cnblogs.com/icmzn/p/5060195.html
我觉得这篇文章总结的很到位了,不再赘述【其实自己也没100%理解透彻233,等学习深入了再回头看看】


第二篇博客,虽然内容很简单,但觉得还是有点货的吧hhh,以后继续加油吧

以上是关于阅读《C++Primer》的个人记录——2.1基本内置类型-关于浮点数补码的主要内容,如果未能解决你的问题,请参考以下文章

学习C++ Primer 的个人理解

C++ Primer 0x02 练习题解

程序清单2.1_first.c程序_《C Primer Plus》P15

C++ Primer 0x0E 学习笔记

C++ Primer 0x0E 学习笔记

C++ Primer 0x07 学习笔记