1. 程式人生 > >C/C++ 關於float和double型別與二進位制的轉換實現。。

C/C++ 關於float和double型別與二進位制的轉換實現。。

void FloatToString(float fNum,char *pStr)
{
	unsigned int nData = ((unsigned int *)&fNum)[0];

	for (int i = 0;i < 32;i ++)
	{
		pStr[31 - i] = (char)(nData & 1) + '0';
		nData >>= 1;
	}
	pStr[32] = '\0';
}

void DoubleToString(double dNum,char *pStr)
{
	UINT64 nData = ((UINT64 *)&dNum)[0];

	for (int i = 0;i < 64;i ++)
	{
		pStr[63 - i] = (char)(nData & 1) + '0';
		nData >>= 1;
	}
	pStr[64] = '\0';
}

float StringToFloat(char *pStr)
{
	unsigned int nData = 0;
	float *pData;

	for (int i = 0;i < 31;i ++)
	{
		nData += (pStr[i] - '0');
		nData <<= 1;
	}
	nData += (pStr[31] - '0');
	pData = (float *)&nData;
	return *pData;
}

double StringToDouble(char *pStr)
{
	UINT64 nData = 0;
	double *pData;

	for (int i = 0;i < 63;i ++)
	{
		nData += (pStr[i] - '0');
		nData <<= 1;
	}
	nData += (pStr[63] - '0');
	pData = (double *)&nData;
	return *pData;
}


void PrintfBinary(unsigned char cData)
{
	for (int i = 7;i >= 0;i --)
	{
		if (cData & (1 << i))
		{
			cout << "1";
		} 
		else
		{
			cout << "0";
		}
	}
}

float fNum = 7.5;
unsigned char *pChar = reinterpret_cast<unsigned char *>(&fNum);
	
for(int i = sizeof(float) - 1; i >= 0; --i)
{
	PrintfBinary(pChar[i]);
}

以上是簡單驗證和實現的例子。。

相關推薦

C/C++ 關於floatdouble型別二進位制轉換實現

void FloatToString(float fNum,char *pStr) { unsigned int nData = ((unsigned int *)&fNum)[0]; for (int i = 0;i < 32;i ++) {

c語言floatdouble型別的理解

float:1bit(符號位)+8bit(指數位,範圍-128~127)+23bit(尾數位) double:1bit + 11bit + 52bit 例:8.25(十進位制) -----> 1000.01(二進位制)   //1x2^3 +1x2^(-2)=8.2

java中的floatdouble型別

1、float 單精度、8位有效數字、第8位四捨五入(第九位大於等於3則進一位) 2、double 雙精度、17位有效數字 ======================================

VS2012中用cout輸出floatdouble型別資料

今天在用C++程式設計的時候,發現用cout輸出的float和double型別精度有問題 float fTest=1; double dTest=1; cout<<fTest<<endl; cout<<dTest<<endl;

floatdouble型別的記憶體分佈比較方法

C/C++的浮點資料型別有float和double兩種。 型別float大小為4位元組,即32位,記憶體中的儲存方式如下:  符號位(1 bit) 指數(8 bit) 尾數(23 bit) 型別double大小為8位元組,即64位,記憶體佈局如下: 符號位

java 中floatdouble型別資料取值詳解

1、定義標準 IEEE754 在IEEE754標準中進行了單精度浮點數(float)和雙精度數浮點數(double)的定義。 float有32bit,double有64bit。它們的構成包括符號位

Android學習之byte陣列double型別之間的轉換

在java中,一個byte元素佔一個位元組,一個double型別資料佔8個位元組 double 轉 byte陣列,程式碼: //double轉byte陣列 double佔8位元組 , 一個byte佔一個位元組 public static byte[] Do

深入理解C++浮點數(floatdouble)型別資料比較、相等判斷

浮點數在記憶體中的儲存機制和整型數不同,其有舍入誤差,在計算機中用近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學記數法。所以浮點數在運算過程中通常伴隨著因為無法精確表示

C++ double型別的數轉換成具體的日期時間

通過OLE獲取到的時間是一個double型別的資料: 比如43058.3876851852,整數部分代表的是:從1899年12月30日午夜起計算“日”數。而小數部分代表的是不足一天。 具體的計算過程結果可以通過,Excel表格格式轉換來檢視 1.在Exce

c/c++: floatdouble、long double

這兩天在寫程式,看了一些文章,轉過來備忘。原文地址是: 單精度浮點數在機內佔4個位元組,用32位二進位制描述。 雙精度浮點數在機內佔8個位元組,用64位二進位制描述。 浮點數在機內用指數型式表示,分解為:數符,尾數,指數符,指數四部分。 數符佔1位二進位制,表示數的正負

C++浮點數(floatdouble)型別資料比較

浮點數在記憶體中的儲存機制和整型數不同,其有舍入誤差,在計算機中用近似表示任意某個實數。具體的說,這個實數由一個整數或定點數(即尾數)乘以某個基數(計算機中通常是2)的整數次冪得到,這種表示方法類似於基數為10的科學記數法。所以浮點數在運算過程中通常伴隨著因為無法精確表示而進行

c#中ClassStruct使用性能的區別

回收 數據結構 com 垃圾回收 父類 改變 med .cn 指針 在Unity中很多已經定義為結構體的數據結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用類型,Str

c語言floatdouble數據保留2位小數

float col 數據 style pan c語言 div spa 保留 float sp = 36.51647; sp=( (float)( (int)( (sp+0.005)*100 ) ) )/100; 挺實用的。double也可以。c語言float、doub

c++ int型double型運算

    #include<iostream> using namespace std; int main() { int a, b; a=3; b=4; cout<<"a/b ="<<a/b<<endl; cout

floatdouble的數值怎麼儲存在二進位制

稍微淺學過二進位制的人,都清楚二進位制是個什麼東西。我們都瞭解正整數是怎麼轉化成二進位制的,那麼計算機中,又是怎麼儲存folat,double型別的數值的呢? 要像弄清楚這個問題,首先得清楚二進位制是怎麼表示小數的。(這一點請注意了) 十進位制是怎麼表示小數的呢? 比如,125.456&

c學習筆記--2變數型別基本操作

好久之前的了,學習c語言的筆記。 依舊是老套路,從基礎的變數型別,到函式定義一步步學起 #include <stdio.h> #include <string.h> //c語言的變數型別與基本操作 void test2() { //數

徹底搞清楚 C/C++ 中日期時間 time_t struct tm,time(NULL),ctime;strftime

#include <stdio.h> #include <stdlib.h> #include <time.h> int main( void ) { long i = 10000000L;

c#中ClassStruct使用效能的區別

在Unity中很多已經定義為結構體的資料結構 Vector2, Vector3 和 Vector4 Rect Color和Color32 Bounds Touch 1.Class為引用型別,Struct為值型別 值型別與引用型別的區別這兩篇文章講得很好 雖然我

基本資料型別操作三:floatdouble變數的賦值

         拿賦零值做舉例,給float型變數賦零值有以下幾種方式: float a; a = 0; a = 0.; a = 0.0; a = 0.f; a = 0.0f;首先這幾種賦值方式都是可行的。0是整型,0.和0.0都是double型,0.f和0.0f是fl

Sql中decimal、floatdouble型別的區別用法

三者的區別介紹 float:浮點型,含位元組數為4,32bit,數值範圍為-3.4E38~3.4E38(7個有效位) double:雙精度實型,含位元組數為8,64bit數值範圍-1.7E308~1.7E308(15個有效位) decimal:數字型,128bit,不存