A. 單片機的浮點數存儲
float t=523.5;
char *p = (char*)&t;
就像這樣讀取第一位元組,char *p = (char*)&t+1;
讀取第二位元組,以此類推然後一位元組一位元組的讀出數據保存在24裡面,最後按順序讀回去
B. 計算機是如何存儲浮點數的(工作原理,實現方式)
計算機用二進制來表示數字,浮點數也是如此:
首先了解如何用二進製表示小數(也就是如何把十進制小數轉化為二進製表示):
舉一個簡單例子,十進制小數 10.625
1)首先轉換整數部分:10 = 1010b
2)小數部分0.625 = 0.101b
(用「乘2取整法」:0.625*2=1.25,得第一位為1,0.25*2=0.5,得第二位為0,0.5*2=1, 得第三位為1,餘下小數部分為零,就可以結束了)
3)於是得到 10.625=1010.101b
換個表示方式更加深入理解:
1*(10^1)+0*(10^0)+6*(10^-1)+2*(10^-2)+5*(10^-3) =
1*(2^3) + 0*(2^2) + 1*(2^1) + 0*(2^0) + 1*(2^-1) + 0*(2^-2) + 1*(2^-3)
4) 類似十進制可以用指數形式表示:
10.625=10625*(10^-3)
所得的二進制小數也可以這樣指數形式表述:
1010.101b=1010101 * (2^-3)
也就是用有效數字a和指數e來表述: a * (2^e)
用一個32bit的空間(bit0~bit31)來存儲這么一個浮點數,如此分配存儲空間:
bit0 ~ bit22 共23bit,用來表示有效數字部分,也就是a,本例中a=1010101
bit23 - bit30 共8個bit,用來表是指數,也就是e,范圍從-128到127,實際數據中的指數是原始指數加上127得到的,如果超過了127,則從-128開始計,所以這里e=-3表示為124
bit31 為符號位,1表示負數,這里應該為0
把上述結果填入32bit的存儲器,就是計算機表示小數10.625的形式。
注意這個例子的特殊性:它的小數部分正好可以用有限長度的2進制小數表示,因此,而且整個有效數字部分a的總長度小於23,因此它精確的表示了10.625,但是有的情況下,有效數字部分的長度可能超過23,甚至是無限多的,那時候就只好把後面的位數截掉了,那樣表示的結果就只是一個近似值而非精確值;顯然,存儲長度越長,精度就越高,比如雙精度浮點數長度為64位,1位符號位,11位指數位,52位有效數字。
C. 浮點數在計算機中的存儲方式
應該是: 在一個為32bit的存儲空間中存儲浮點數,bit0~bit22存儲有效數字部分;bit23~bit30存儲指數部分;bit31存儲符號位。 在一個為64bit的存儲空間中存儲浮點數,bit0~bit51存儲有效數字部分;bit52~bit62存儲指數部分;bit63存儲符號位。 還一種 在一個為80bit的存儲空間中存儲浮點數,bit0~bit62存儲有效數字部分;bit63~bit78存儲指數部分;bit79存儲符號位。 只有這三種了,其他都不支持的 未來可能還有128位浮點數
D. 浮點數 在計算機內的存儲形式
浮點數不難,但是要想記熟還真有點不容易,多琢磨琢磨。
一般情況下,浮點數的表示有一下幾個要點:
1、要規格化(讓浮點數表示結果唯一),因為100=10^2 = 0.1 * 10^3, 所以第一步要統一地規格化,確定「階數」和「尾數」(尾數在0.5-1之間,也就是二進制的0.1-1.0之間)
2、「階碼」一般用「移碼」表示法,而「尾數」一般用「原碼/補碼表示法,「數符」表示浮點數的正副號
3、浮點數的形式: 「符號位」【應該就是『數符』】+「階碼」+「尾數「
--浮點數的表示按照不同地標准,表示方法不同,你的原問題沒講清楚用什麼格式表示,我就用最常用地格式來理解了
------------------
其實就以上兩點,計算機中「『帯符號數』的表示」有四種:原碼、補碼、反碼、移碼,這些都是基礎知識,可以自己去看一下這四種表示方法,就自然明白「階符、數符」這些相當於「符號位」的作用了。
先簡單講一下吧,你再結合詳細資料看吧:【設所表示的都是定點純小數】
(小數點前面可以看成是「符號位」,也就對應原來地「階符」和「數符」)
原碼:0.11表示0.75(2^-1 + 2 ^-2), 1.11表示 『-0.75』(前面的1相當於符號位,表示這個數是負數,也就是說「符號位是0」表示正數,1表示負數)
補碼:最普遍地就是補碼了 0.11表示0.75, 1.11表示『-0.25』(也是「0」為正數,1為負數。和原碼地規律一樣)
反碼,最簡單了:正數不變,負數對每一位『取反』即可,0.11=0.75,1.10=-0.25(即0.01地相反數)
-------------以上三種表示方法,對正數的情況都不做處理,但是移碼表示法要對正數做處理。
移碼:1.01=0.25,而0.01=-0.75
。移碼復雜一點,他的表示方法是: 移碼= 2^階碼位數 + 真值(真值:指原來那個『帯符號數』,注意要把把正副號帶入計算)
-----------------------------------
N=-0.110101x2^100: 階數是「正100」,尾數是「負0.110101」,所以整個浮點數是個負數,所以第一位是「1」【第一個符號位-「數符」表示『尾數的正負號』】
階碼是「10 0100」【移碼表示法,最高位是「符號位」】
所以,應該表示為: 1(符號位) 100100(階碼的移碼表示) 11010100【尾數和符號位結合起來,用的是原碼表示法】
E. 計算機浮點數的儲存原理
浮點是以單元形式儲存在內存上的,但每個單元內存有限,所以比如你想輸入1/3的話,你以為是1/3了,實際上不足1/3,而是0.3333333333333333,所以計算時,會以0.3333333333333333的形式去計算,而不是1/3,因此出現了本來是0.6的,而輸出卻是0.599976.建議把浮點精度變大
F. 誰能解釋浮點數在內存是怎樣存儲的嗎比如-3.14159如何存儲
以32位浮點數為例:
-3.14159轉化為二進制為-11.xxxx,後面的xxxx我就算了,你自己算,不管怎樣,小數點後面始終精確到第23位
也即-1.1xxxx*2^1,
現在開始計算:符號位是1,階碼是1+127,尾數是1xxxx
至於小數點前面那個1,不存儲,該浮點數參與計算的時候默認加上即可
看明白規律了嗎?
將其二進制形式按符號位、階碼、尾數的形式順序存入內存中的一個4位元組空間里
G. 浮點型參數怎麼存到存儲器里
一般我更喜歡用共用體:
//聲明共用體
union _UnFloat
{
unsigned char byData[4];
float fData;
}unFloat;
//保存到存儲器:
float Data = 123.456789;//浮點數
unFloat.fData = Data;//浮點數賦值給共用體
//然後unFloat.byData[0]、unFloat.byData[1]、unFloat.byData[2]、unFloat.byData[3]就分別是浮點數4個位元組的內容了,把這四個位元組寫入存儲器就可以了。
//從存儲器中讀出浮點數據
unFloat.byData[0] = 讀存儲器中浮點數保存的第一個位元組;
unFloat.byData[1] = 讀存儲器中浮點數保存的第二個位元組;
unFloat.byData[2] = 讀存儲器中浮點數保存的第三個位元組;
unFloat.byData[3] = 讀存儲器中浮點數保存的第四個位元組;
float Data = unFloat.fData;//這個就是存儲器中保存的浮點數了
實際應用中一般保存到存儲器或者RS232、RS485傳輸等,我都使用這種方式,比較方便。
H. C語言浮點型是怎樣存儲的
C語言中的float類型佔用4個位元組長,這4個位元組分為如下3部分:
1位符號位 8位階碼 23位尾數部分
這23位尾數才真正存儲了二進制的有效位,將這23位二進制轉換為十進制也就6到7位有效數字。
I. 請問浮點型數據在計算機是怎麼存儲的
對於浮點類型的數據採用單精度類型(float)和雙精度類型(double)來存儲,float數據佔用32bit,double數據佔用64bit。
無論是單精度還是雙精度在存儲中都分為三個部分:
1、符號位(Sign) : 0代表正,1代表為負。
2、指數位(Exponent):用於存儲科學計數法中的指數數據,並且採用移位存儲。
3、尾數部分(Mantissa):尾數部分。
(9)浮點數的存儲擴展閱讀
實型變數分為兩類:單精度型和雙精度型,
其類型說明符為float 單精度說明符,double
雙精度說明符。在Turbo
C中單精度型佔4個位元組(32位)內存空間,其數值范圍為3.4E-38~3.4E+38,只能提供七位有效數字。
雙精度型佔8
個位元組(64位)內存空間,其數值范圍為1.7E-308~1.7E+308,可提供16位有效數字。
實型變數說明的格式和書寫規則與整型相同。
例如: float x,y; (x,y為單精度實型量)
double a,b,c; (a,b,c為雙精度實型量)
實型常數不分單、雙精度,都按雙精度double型處理。
J. 浮點數的存儲問題
先看看浮點數格式
·一個浮點數總共有4個位元組,32位
第一個比特表符號 0正數 1負數
後八個比特表階碼,即為指數,這個數在實際的數上面加127
最後23個比特表尾數 原碼表示
具體分析
對於3.25
正數 首位為0
用二進製表示 11.01=1.101乘以2的1次方
所以階碼為1 127+1=128
10000000
對於尾數1.101,因為規格化的數都是最高位為1,即小數點左邊的數為1
所以這個1就省略,因此存儲的時候就存101
即
10100000 00000000 0000000
把所有的拼起來
01000000 01010000 00000000 00000000
你的上面最後寫反了