C++ 察看二进制代码的程序 看一下这代码是什么意思。

来源:百度知道 编辑:UC知道 时间:2024/06/21 18:19:30
#include<iostream>
using namespace std;
//--------------------------------
void main()
{
float i = 19.2F;
unsigned int* pa = reinerpret_cast<int*>(&i);//***
for(int k = 31; k >= 0; k--)
cout<<(*pa>>k & 1)<<(i == 31||i == 23 ? "-":""); //***
cout<<"\n";
如上代码,是查看浮点数的二进制代码的。其中有两行我在后面加了三个星号。第一个的那行,为什么要给转换成整型的地址?(即是那个热interpret_cast<int>)
第二个的那行,后面的输出(i == 31||i == 23 ? "-":"")是什么意思?

呵呵,我来领分了!
第一,float和insigned int都占4个字节(即32bit).
所以,unsigned int* pa = reinerpret_cast<int*>(&i);就相当于把19.2F占用的4个字节被一个unsigned int的指针指向(所以*pa和i其实从物理字节单元角度来看,两者是等价的,其内容完全一样),目的很简单,是为了以后的移位操作方便,如果是浮点,就不能右移操作了。
第二,cout<<(*pa>>k & 1)<<(i == 31||i == 23 ? "-":"");我只能说楼主你太粗心了,这句话一定是你看错了。正确的应该是cout<<(*pa>>k & 1)<<(k == 31||k == 23 ? "-":"")。这句话的意思是:
因为要看float的32个二进制位,所以要用for偱环32次,从高位开始,所以是for(int k = 31; k >= 0; k--)
然后,就可以知道,当k是第31位是,即符号位(正数为0,负数为1);当k为第23位是,这是整数部分和小数部分的分界点,之后的0~22位全是小数部。
OK,现在就很明白了,cout<<(*pa>>k & 1)<<(k == 31||k == 23 ? "-":"")无非是把符号位和整数部分,小数部分明确的分隔开罢了。