關於float轉int的函數實現

之前寫過幾次int與char類型的字符串相互轉換的問題,這次就想以float轉成int爲題,進行函數實現。

首先先對float的存儲方式,做一個簡單說明:


float(浮點數):在32位的計算機中佔4個字節,存儲格式爲1位的符號位、8位的指數位、23位的尾數位。


1位的二進制數,若爲1則表示爲負數,若爲0則表示爲正數。

 

8位的二進制數,表示範圍爲0 ~255,IEEE規定指數位減去127爲真正的指數,指數範圍爲-126~128。


23位的二進制數,最高位(整數位)的1省略不保存。若需要取整數部分,則需要將尾數位左移到整數位,再將最高位的1補齊,左移位數由指數決定。

因爲float類型不能使用"<<",">>"運算符,得到二進制位。筆者在進行上述嘗試時,均以編譯器自動調整數據而失敗。在瀏覽了多篇文檔後,找到一個適合本次要求的函數,內存拷貝函數 memcpy();

內存拷貝函數:可以拷貝任意數據類型,拷貝長度爲指定大小。

float fla = -12.5;
unsigned long ina;
memcpy(&ina ,&fla,sizeof(float));
接下來的事情,就比較容易了:
//得到並記錄符號位
int GetSign(unsigned long ina)
{
	int sign = ina & (1<<31);
	if(sign != 0)
	{
		return -1;
	}
	else
	{
		return 1;
	}
}

//讀出指數位
int GetExp(unsigned long ina)
{
	int exp = 0;
	for(int i=23; i<31; i++)
	{
		exp |= (ina & 1<<i);
	}
	exp >>= 23;
	exp -= 127;//ieee 規定指數位須減去127 爲真正的指數
	
	return exp;
}

註釋1:

exp >>= 23;//將指數位右移最左邊


ina &= (1<<23)-1;//保留小數位
ina |= 1<<23;//填入小數位前的 1
ina >>= (23-exp);//整數部分右移到合適位置
ina *= sign;//符號位

註釋2:

ina &= (1<<23)-1;//將尾數位的數字保留下,其餘數字丟棄;

 
至此,就得到了正確的float類型轉爲int類型的數據。

參考文獻:1.float數據在內存中的存儲方法 http://blog.csdn.net/yezhubenyue/article/details/7436624;

2.C函數之memcpy()函數用法 http://blog.csdn.net/tigerjibo/article/details/6841531.


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章