原码,反码,补码,移码

来源:互联网 发布:potplayer播放器mac版 编辑:程序博客网 时间:2024/06/05 18:33

以8位二进制为例:

原码进行有符号运算是出错,

引进反码,反码运算出现-0,+0,

引进补码,-0的二进制表示(10000000)表示最小的负数(-128)

引进移码,为了方便阶码对阶,比大小,负数符号为1,变成0,正数符号为0,变成1,负数,正数整体向右偏移,更方便比较大小。

移码=补码+10000000.

阶码255用于表示溢出。

首先说一下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数而言,原,反,补码都一样, 对负数而言,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号.

 

在IEEE754标准中,规定,float的32位这样分:

    符号位(S)

1

阶码(E)

 8

尾数(M)

23

double的情况与float完全相似,只是它的内在形式是

    符号位(S)

          1

阶码(E)

11

尾数(M) 

   52

 

查看数值内存表示方法:

 

 float fDigital = 0.0f;       
 unsigned long nMem;// 临时变量,用于存储浮点数的内存数据
 // 将内存按位复制到临时变中,以便取用,此时的nMem并不等于fDigital了,它是按位复制的。
 nMem = *(unsigned long*)&fDigital;
 cout<<nMem<<endl;  //一般得到一个很大的整数.

 bitset<32>mybit(nMem);//妙在此处,这里的输出就是32float的内存表示了.终于完全直观地看到了.
 cout<<mybit<<endl;   //00000000000000000000000000000000 用-0.0来试,也是如此.

 

参考:http://blog.csdn.net/biblereader/archive/2006/06/21/819428.aspx

原创粉丝点击