將float型資料轉化成int型
在將float型資料轉化成int資料前,首先我們要了解float型資料在記憶體中的儲存方式,float型別在記憶體中佔4個位元組32個位元位,如下:
0 00000000 00000000000000000000000
1.符號位
其中最左邊的為符號位,0為正,1為負。
2.指數
接下來一共8位,也用二進位制來表示,系統預設偏移量計算值為127,也就是說,如果你的指數是4,那麼記憶體中儲存的就是127+4。
3.尾數
最後尾數是23位的小數部分,系統預設去除了小數點前的1。
接下來以12.25為例,我們具體說下儲存方式。將12.25轉化成二進位制表示,即1100.01,它在記憶體中的儲存為:
首先是符號位,為0,接下來是指數,可以看到它的指數是3(小數點挪到第一個1挪動了3位),則指數為1000 0010,剩下的保留23位,對於無限迴圈數字取其前23位,如果位數不夠,填充零。所以12.25應該表示為:
0100 0001 0100 0100 0000 0000 0000 0000。
弄明白了float的儲存,接下來我們要考慮的是怎麼將它讀取出來方便我們將它轉化成int型資料,因此,設計了以下的結構體:
struct Node
{
unsigned int a:23;
unsigned int b:8;
unsigned int c:1;
};
這個結構體的設計基於計算機小端儲存在於把float每一個部位的資料讀取出來,在根據它的儲存機制,計算int值。
具體的程式碼實現如下:
#include<stdio.h>
#include <iostream>
using namespace std;
struct Node
{
unsigned int mantissa:23;
unsigned int move:8;
unsigned int sign:1;
};
int Float_int(Node *p)
{
int a=p->mantissa ;
int b=p->move -127;
int ar[23]={0};//開闢一個數組,用於儲存23位尾碼
for(int i=22;i>=0;--i)
{
ar[i]=a%2;
a=a/2;
}
int x=1;
for(int i=0;i<b;i++)//轉化成整形時,只需要讀取整數部分,不能忽略系統省去的1。
{
x=x*2+ar[i];
}
if(p->sign ==0)return x;//判斷符號
if(p->sign!=0) return -x;
}
int main()
{
float x;
cin>>x;
Node *p=(Node *)&x;
int a=Float_int(p);
cout<<a<<endl;
return 0
}
!!!這種方法在開闢陣列時浪費了大量的記憶體,可以考慮採用動態開闢陣列的方法,提高記憶體利用率。