float數據在計算機內存中的存儲方法

***************************************************

更多精彩,歡迎進入:http://shop115376623.taobao.com

***************************************************


浮點型變量在計算機內存中占用4字節(Byte),即32-bit。遵循IEEE-754格式標準。


一個浮點數由2部分組成:底數m指數e
??±mantissa × 2exponent
(注意,公式中的mantissa 和 exponent使用二進制表示)
底數部分 使用2進制數來表示此浮點數的實際值。
指數部分 占用8-bit的二進制數,可表示數值范圍為0-255。

但是指數應可正可負,所以IEEE規定,此處算出的次方須減去127才是真正的指數。所以float的指數可從 -126到128.

底數部分實際是占用24-bit的一個值,由于其最高位始終為 1 ,所以最高位省去不存儲,在存儲中只有23-bit。

到目前為止, 底數部分 23位 加上指數部分 8位 使用了31位。那么前面說過,float是占用4個字節即32-bit,那么還有一位是干嘛用的呢? 還有一位,其實就是4字節中的最高位,用來指示浮點數的正負,當最高位是1時,為負數,最高位是0時,為正數。

浮點數在4字節中的存放:
浮點數據就是按下表的格式存儲在4個字節中:
Address+0 Address+1 Address+2 Address+3
Contents SEEE EEEE EMMM MMMM MMMM MMMM MMMM MMMM
?S: 表示浮點數正負,1為負數,0為正數


E: 指數加上127后的值的二進制數
M: 24-bit的底數(只存儲23-bit)

主意:這里有個特例,浮點數 為0時,指數和底數都為0,但此前的公式不成立。

因為2的0次方為1,所以,0是個特例。當然,這個特例也不用認為去干擾,編譯器會自動去識別。


通過上面的格式,我們下面舉例看下-12.5在計算機中存儲的具體數據:
Address+0 Address+1 Address+2 Address+3
Contents 0xC1 0x48 0x00 0x00
?接下來我們驗證下上面的數據表示的到底是不是-12.5,從而也看下它的轉換過程。
由于浮點數不是以直接格式存儲,他有幾部分組成,所以要轉換浮點數,首先要把各部分的值分離出來。

Address+0 Address+1 Address+2 Address+3
格式 SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
二進制 11000001 01001000 00000000 00000000
16進制 C1 48 00 00


可見:
S: 為1,是個負數。
E:為 10000010 轉為10進制為130,130-127=3,即實際指數部分為3.
M:為 10010000000000000000000。 這里,在底數左邊省略存儲了一個1,使用 實際底數表示為 1.10010000000000000000000?
到此,我們吧三個部分的值都拎出來了,現在,我們通過指數部分E的值來調整底數部分M的值。

調整方法為:如果指數E為負數,底數的小數點向左移,如果指數E為正數,底數的小數點向右移。小數點移動的位數由指數E的絕對值決定。
這里,E為正3,使用向右移3為即得:
1100.10000000000000000000
至次,這個結果就是12.5的二進制浮點數,將他換算成10進制數就看到12.5了,

如何轉換,看下面:

小數點左邊的1100 表示為 (1 × 23) + (1 × 22) + (0 × 21) + (0 × 20), 其結果為 12 。
小數點右邊的 .100… 表示為 (1 × 2-1) + (0 × 2-2) + (0 × 2-3) + ... ,其結果為.5 。
以上二值的和為12.5, 由于S 為1,使用為負數,即-12.5 。
所以,16進制 0XC1480000 是浮點數 -12.5 。

上面是如何將計算機存儲中的二進制數如何轉換成實際浮點數,下面看下如何將一浮點數裝換成計算機存儲格式中的二進制數。
舉例將17.625換算成 float型。
首先,將17.625換算成二進制位:10001.101 ( 0.625 = 0.5+0.125, 0.5即 1/2, 0.125即 1/8 如果不會將小數部分轉換成二進制,請參考其他書籍。)

再將 10001.101 向右移,直到小數點前只剩一位 成了 1.0001101 x 2的4次方(因為右移了4位)。此時 我們的底數M和指數E就出來了:
底數部分M,因為小數點前必為1,所以IEEE規定只記錄小數點后的就好,所以此處底數為 0001101 。
指數部分E,實際為4,但須加上127,固為131,即二進制數 10000011?
符號部分S,由于是正數,所以S為0.
綜上所述,17.625的 float 存儲格式就是:
0 10000011 00011010000000000000000
轉換成16進制:0x41 8D 00 00
所以,一看,還是占用了4個字節。

十進制小數→→→→→二進制小數?方法:“乘2取整”

對十進制小數乘2得到的整數部分和小數部分,整數部分既是相應的二進制數碼,再用2乘小數部分(之前乘后得到新的小數部分),又得到整數和小數部分.
如此不斷重復,直到小數部分為0或達到精度要求為止.第一次所得到為最高位,最后一次得到為最低位
如:0.25的二進制
0.25*2=0.5??取整是0
0.5*2=1.0????取整是1
即0.25的二進制為?0.01?(?第一次所得到為最高位,最后一次得到為最低位)

0.8125的二進制

0.8125*2=1.625???取整是1

0.625*2=1.25?????取整是1

0.25*2=0.5???????取整是0

0.5*2=1.0????????取整是1

即0.8125的二進制是0.1101(第一次所得到為最高位,最后一次得到為最低位)


《代碼優化:有效使用內存》,發現里面提到了兩種方法:
1
#pragma pack(push)
#pragma pack(1)
struct struct1
{
??? int i;
??? short j;
??? char c;
};
#pragma pack(pop)

2
修改編譯指令的參數,來禁止內存對齊:
VC++?????? ? ? ??/Zn1(VS2005下,右擊項目-屬性-配置屬性-C/C++-代碼生成-結構成員對齊-“1字節(/Zn1):”(即禁止內存對齊),默認是使用默認值,即按照結構中占用空間最大的成員進行對齊。的size進行對齊。
Borland C++??/-a1

2是對整個項目禁用內存對齊,而法1可以針對特定的結構禁用內存對齊,其提供了更大的靈活性.



另外,該書中還提到:
char
不對齊;
short
沿偶地址對齊;
int/float
沿取值為4的倍數的地址對齊。
double
沿取值為8的倍數的地址對齊


補充:數據的手工對齊:

char *p;
int temp = align_power-1;
p=(char*)malloc(need_size +?temp;
p=(char*)malloc(((int)p+temp)&temp);//修改了p,所以釋放p前記得要歸位.注:align_power是所需要的對齊冪,char*(也可以為int*)是指針類型。另外,釋放p之前記得讓其指向所申請的內存的首地址上。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/458901.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458901.shtml
英文地址,請注明出處:http://en.pswp.cn/news/458901.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Geometric Shapes - POJ 3449(多邊形相交)

題目大意:給一些幾何圖形的編號,求出來這些圖形都和那些相交。分析:輸入的正方形對角線上的兩個點,所以需要求出來另外兩個點,公式是:x2:(x1x3y3-y1)/2; y2:(y1y3x1-x3)/2;x4:(x1x3-y3y1)/2; y4:(y1y3-x1x3…

更新10_linux,時隔十年,QQ更新了Linux版本

昨天1024程序員節,QQ悄悄地更新了QQ for Linux,也許是給各位一個驚喜吧。官網及其的簡陋。和一個Word文檔似的。十年一更,有網友稱,瞬間回到QQ2006,確實界面功能有些落后,相信QQ可以跟上潮流的,…

[滲透測試]掃目錄,Sqlmap利用均超時,利用dirb掃描

今天碰到一個網友傳來的Webshell地址,問我對方如何取得webshell。 網站為阿里云服務器,存在明顯的注入漏洞,但是任何語句都會令網頁報錯,sqlmap一直超時,御劍掃描目錄1個線程也會導致被屏蔽IP。 經一學長提點&#xff…

x = x+1,x+=1,x++那個的執行效率高

*************************************************** 更多精彩,歡迎進入:http://shop115376623.taobao.com *************************************************** x x1的效率最低 1)讀取右邊x的地址 2)執行x13)讀…

修正線性單元(Rectified linear unit,ReLU)

修正線性單元(Rectified linear unit,ReLU) Rectified linear unit 在神經網絡中,常用到的激活函數有sigmoid函數f(x)11exp(?x)、雙曲正切函數f(x)tanh(x),今天要說的是另外一種activation function,recti…

C語言綜合期末作業,內蒙古農業大學2010年期末c語言綜合作業.doc

內蒙古農業大學2010年期末c語言綜合作業綜合練習作業#includeint main(void){int choice,i;void shuai();void ge();void wang();void bing();for(i1;i<5;i){printf("[1]統計字符個數\n");printf("[2]判斷素數\n");printf("[3]求斐波那契數列\n&qu…

鏈表創建、逆置、刪除詳解

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 對鏈表的理解&#xff1a;http://www.nowamagic.net/librarys/veda/detail/2220 #inc…

python與shell的3種交互方式介紹

【目錄】 1.os.system(cmd) 2.os.popen(cmd) 3.利用subprocess模塊 4.subprocessor模塊進階 【概述】 考慮這樣一個問題&#xff0c;有hello.py腳本&#xff0c;輸出”hello, world!”&#xff1b;有testinput.py腳本&#xff0c;等待用戶輸入&#xff0c;然后打印用戶輸入的數…

C語言里if語句變量作為判斷條件,C語言教學(九-上)if else判斷語句

原標題&#xff1a;C語言教學(九-上)if else判斷語句今天講if else判斷語句&#xff0c;簡單理解就是進行條件判斷&#xff0c;如果條件達到則執行if 里或else里的語句。先來看if。if的寫法和for差不多,就是不用括號里的兩個分號&#xff0c;if (條件) { }&#xff0c;if加括號…

const修飾指針和引用的用法【轉貼】

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** const修飾的指針會額外的占內存嗎&#xff1f; 仍然是4&#xff0c;不會占額外的…

調整linux系統時區

cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 好吧&#xff0c;使用tzselect又靠譜些&#xff0c;使用前把/etc/localtime刪除了。 執行上前那個告訴我文件重新了&#xff0c;所以就沒有搞了轉載于:https://www.cnblogs.com/hark0623/p/4807426.html

stm32c語言設計以及注釋,13個基于STM32的經典項目設計實例,全套資料~-嵌入式系統-與非網...

STM32單片機現已火遍大江南北&#xff0c;各種教程資料也是遍布各大網站論壇&#xff0c;可謂一抓一大把&#xff0c;但大部分都差不多。今天總結了幾篇電路城上關于STM32 的制作&#xff0c;不能說每篇都是經典&#xff0c;但都是在其他地方找不到的&#xff0c;很有學習參考意…

memcpy,strcpy,strncpy

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** memcpy c和c使用的內存拷貝函數.從源src所指的內存地址的起始位置開始拷貝n個字節…

二維數組聯通子數組和最大

題目要求&#xff1a; 返回一個二維整數數組中最大聯通子數組的和。輸入一個二維整形數組&#xff0c;數組里有正數也有負數。文件輸出。思路:和之前的動態規劃相識&#xff0c;把二維數組轉換為一維數組&#xff0c;先求每一個列的子數組和最大&#xff0c;最后在用正數就加&a…

c語言如何給變量加鎖,C語言互斥鎖-條件變量實現公共緩存區數據讀寫

#include char buffer[128];int has_data0;pthread_mutex_t mutex;pthread_cond_t cond;pthread_cond_t cond2;void read_buf(void){do{pthread_mutex_lock(&mutex);//鎖定互斥鎖if(has_data0){/*阻塞線程,等待另外一個線程發送信號&#xff0c;同時為公共數據區解鎖*/pthr…

view-activity跟控件在onkey事件上的傳遞關系

android 中Activity跟View對于鍵盤的監聽&#xff0c;主要有以下幾個方法 //按鍵按下 public boolean onKeyDown(int keyCode, KeyEvent event) {} //按鍵彈起 public boolean onKeyUp(int keyCode, KeyEvent event) {} //常按 public boolean onKeyLongPress(int keyCode, Ke…

PMP考試的過與不過

*************************************************** 更多精彩&#xff0c;歡迎進入&#xff1a;http://shop115376623.taobao.com *************************************************** 我在一年多時間里參加了三次PMP考試&#xff0c;前兩次都失敗&#xff0c;直到第三次才…

JPA一對多循環引用的解決

說是解決&#xff0c;其實不是很完美的解決的&#xff0c;寫出來只是想記錄一下這個問題或者看一下有沒有哪位仁兄會的&#xff0c;能否知道一二。 下面說說出現問題&#xff1a; 問題是這樣的&#xff0c;當我查詢一個一對多的實體的時候&#xff0c;工具直接就爆了&#xff0…

太原理工大學c語言課程設計報告,[太原理工大學C語言實驗報告.doc

[太原理工大學C語言實驗報告本科實驗報告課程名稱&#xff1a; 程序設計技術B實驗項目&#xff1a;實驗地點&#xff1a; 明向校區軟件學院機房專業班級&#xff1a; 學號&#xff1a;學生姓名&#xff1a;指導教師&#xff1a; 呼克佑2014年 12月 日實驗名稱 實驗一 C語言的運…

網頁常用動態效果--懸浮廣告

關鍵在于動態獲取滾動坐標值 測試滾動事件 $(window).scroll(function(){ console.log($(window).scrolltop()); }) 獲取三個高度&#xff1a;窗口高度&#xff0c;盒子高度以及滾動坐標值&#xff0c;將廣告盒子設置為絕對定位&#xff0c;當鼠標滾動時&#xff0c;其top值為滾…