c语言科学计数法_C入门:C语言中数据的储存(上)
How Data is stored in computer memory?
儲存數據是計算機進行各種數據操作的基礎,為了理解計算機可以對哪些數據進行怎樣的操作,有必要了解數據在計算機中的儲存方式。
為了有效防止失真,提高數據的準確性和穩定性,計算機使用二進制的方式來儲存數據(關于精妙的底層邏輯,建議參考清華大學王紅老師的課程《數字電子技術基礎》),0和1便是計算機邏輯語言,相應的采用兩段范圍電壓的相對高低(高電平,低電平)來用于機器語言,很多情況下我們采用高電平對應1的正邏輯。理解數據的二進制儲存,就時在探討各種數據與二進制數據之間的轉換。
我們通常講每一個儲存0或1的最小內存單元稱作位(bit),將連續的8位稱作一字節(Byte)。如上圖所示。
最初我們多用計算機儲存數值類數據。常見的數字量數據,在C語言中我們有int(integer)和int的各種派生數據unsigned int,long int,short int....又是需要表示模擬量,然而實現模擬量和二進制的轉換是不現實的,于是用浮點型數據float,double來近似表示模擬數據,根據誤差要求選擇不同精度的浮點型數據。隨著發展,我們對儲存文字信息的需求越來越大,相應的有char類型數據來表達常用字符,隨著計算機在世界范圍的普及,char所能表示的字符已經遠遠不夠了,于是有了各種各樣的char類型的擴充,也有了更多的國際碼制標準。
How integers are stored in memory?
實現二進制和十進制的轉換是容易的,將十進制整數a轉換為二進制表示所需最小位數位n,只需n與a之間滿足
。然而為了表示符號位,必須要再多一位來表示符號。這又造成了問題,編碼的時候符號位應該放到哪里?譯碼的時候如何識別符號位?前人智慧的積累,最終計算機使用一種特殊的編碼方式來儲存整數。
以最高位(MSB ,most significant bit)作為符號位,MSB=0表示正數,反之表示負數。這樣的編碼方式不僅易于計算機理解符號,而且其所具有的正負數特有的補碼關系使得減法運算變得容易。
如上圖,+10用二進制表示為1010,要得到-10只需將1010各位取反然后再加1(即補碼),如果將兩者相加會發現在有效位數內和為0。(關于補碼建議聽王紅老師的課)。這種編碼方式對計算機是有好的,取反(反向器)加1(加法器)都是可硬件實現的。將負數以補碼的形式表達將減法運算轉換為求和運算,也使得硬件實現變得可能。
以此邏輯,4byte的int型數據表示范圍為
~ ,將符號位當作數值位的unsigned int表示的范圍為 ~ 。How character is stored in Computer
char型數據本質上和 int 相同,都是儲存二進制整數值,在計算機看來,他們僅僅是 size 和 range 不同罷了( int 4字節,char 1字節),進行運算處理的方式完全一樣。我們常常覺得char和 int 差別很大,因為我們在創建一個char數據時更多用于輸入輸出到屏幕或文件,當使用有關函數時,會對 cha r數組做特殊處理并且以ASCII碼做相應的轉換。char 并不神秘。
ASCII碼是我們最常用的字符碼制了,如果要處理更多字符(例如漢字)的話,還需要去了解國際上更全面的碼制。
How float or double values are stored in memory?
以float(單精度浮點型)為例,分配4字節(32位)內存
由1bit符號位,8bit指數位和23bit有效位構成。
可以看到double和float只是不同部分位數的區別,本質是相同的,接下來以float為例介紹。
## How to convert floating numbers into binary numbers ?
浮點型數據轉換為二進制會有些不同,因為小數部分和二進制并非11對應的,就像0.5無法用2^n^(n為整數)來表示,這就造成了精度問題,相應的便有單精度float和雙精度double數據來應對不同的誤差要求。
為了搞明白小數部分的二進制表示,我們先回顧十進制
e.g. 我們如何理解4.23
4.23整數部分為4;4.23小數部分為0.23;如何獲得小數點后第一位數據,只需將其x進制數0.23x10=2.3我們可得到第一位為2再將0.3x10=3我們得到第二位為3可以看到將小數部分每x一次n進制,就會有一次整體的進位。此時得到的小數點前的第1位即為剛才小數點后的第一位
同樣的思路操作二進制
e.g.
4.23整數部分為4--->100; 小數部分為0.23; 0.23x2=0.46--->0 0.46x2=0.92--->0 0.92x2=1.84--->1 0.84x2=1.68--->1 0.68x2=1.36--->1 0.36x2=0.72--->0顯然我們得到了一個無限不循環小數100.001110.....
這樣我們就把浮點類數據表示成了二進制數據
## Make the converted binary number to normalize form
為了在計算機中儲存這些數據,我們需要將其規范化,一般化
如上例子100.001110.......=1.00001110....x2^2^
其中1.100001110....為significant bit,將決定浮點數的精度
2^2^(*指數那個2*)為exponent bit,將決定浮點數的范圍
我們終于表達了浮點數的大小(*鼓掌*)
然而如何表示負值,浮點數是沒有補碼反碼這種操作的。同樣的以MSB的取值來表示符號,特殊的是,將exponent bit在加上
,即添加一個較大的正數部分使之無論正負均為正值。如上例子1.00001110....x ,其exponent bit最終結果為 +1=129.由于我們采用科學計數法(*我想應該是這么稱呼的吧*)表示,而且是二進制只有0和1,那么形式總會是1.xxxxx,無需浪費一位來表示小數點之前的1,所以在計算機儲存浮點類型數據時,是不會儲存這一位的。
0.75在計算機中的儲存形式。
根據這個儲存方式不難得出,float的最大精度為
,可表示最大數值為 。note:**關于這樣表示浮點數據的原理及其計算和輸出輸出方法我還沒搞明白,我再研究研究再寫吧,當然希望已經搞明白的小伙伴分享一下啦**
一只小白猿,技術超有限......
還望小伙伴能指出小白猿的錯誤,一起學習,一起分享
微信掃描二維碼關注小白猿啦總結
以上是生活随笔為你收集整理的c语言科学计数法_C入门:C语言中数据的储存(上)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python安装mysqlclient_
- 下一篇: display函数怎么使用_使用网络构建