将一个float型转化为内存存储格式的步骤为:
(1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分的二进制方法在上面已经探讨过了。
(2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。
(3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。特别注意:如果不够23位,右边补0。
(4)如果实数是正的,则在第31位放入“0”,否则放入“1”。
(5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。
(6)
如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。
//上面说的是float的内存结构,double类似,下面是用double举例子。
我的问题是:在网上看到移码就相当于将补码的符号位取反后的数。而上面的步骤中给出的填写移码位置的方法个人感觉与移码是补码的符号位取反后的数矛盾?
求各位解释一下?谢谢!
我知道上面的步骤给出的方法一定是正确的。
double dValue2 = 0.5;
cout << hex << *(unsigned long long *)&dValue2 << endl; //3fe0000000000000
double dValue3 = 0.25; //内存映像 00 1111 1111 01……
cout << hex << *(unsigned long long *)&dValue3 << endl; //3fd0000000000000
比如0.5的表示,用二进制表示时,0.10000,按照上面的说法:
尾数符号位0
阶码符号位0,因为是右移
阶码:因为是右移一位,所以各位取反,1的各位取反,double类型的阶码数值位共10位,0000 0000 01取反得到
1111 1111 10,这样得到的dValue2在内存中的映像前12位为
0011 1111 1110即 3fe,因为0.5尾数部分全是0,不管。
但是如果按照移码是补码的符号位取反来做,-1,即1 0000 0000 01的补码是1 1111 1111 11,符号位取反将1变为0,得0 1111 1111 11,并不是正常答案。
是我哪里理解错了吗?