日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言科学计数法_C入门:C语言中数据的储存(上)

發(fā)布時間:2023/12/2 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言科学计数法_C入门:C语言中数据的储存(上) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

How Data is stored in computer memory?

儲存數(shù)據(jù)是計算機進行各種數(shù)據(jù)操作的基礎,為了理解計算機可以對哪些數(shù)據(jù)進行怎樣的操作,有必要了解數(shù)據(jù)在計算機中的儲存方式。

為了有效防止失真,提高數(shù)據(jù)的準確性和穩(wěn)定性,計算機使用二進制的方式來儲存數(shù)據(jù)(關于精妙的底層邏輯,建議參考清華大學王紅老師的課程《數(shù)字電子技術基礎》),0和1便是計算機邏輯語言,相應的采用兩段范圍電壓的相對高低(高電平,低電平)來用于機器語言,很多情況下我們采用高電平對應1的正邏輯。理解數(shù)據(jù)的二進制儲存,就時在探討各種數(shù)據(jù)與二進制數(shù)據(jù)之間的轉(zhuǎn)換。

我們通常講每一個儲存0或1的最小內(nèi)存單元稱作位(bit),將連續(xù)的8位稱作一字節(jié)(Byte)。如上圖所示。

最初我們多用計算機儲存數(shù)值類數(shù)據(jù)。常見的數(shù)字量數(shù)據(jù),在C語言中我們有int(integer)和int的各種派生數(shù)據(jù)unsigned int,long int,short int....又是需要表示模擬量,然而實現(xiàn)模擬量和二進制的轉(zhuǎn)換是不現(xiàn)實的,于是用浮點型數(shù)據(jù)float,double來近似表示模擬數(shù)據(jù),根據(jù)誤差要求選擇不同精度的浮點型數(shù)據(jù)。隨著發(fā)展,我們對儲存文字信息的需求越來越大,相應的有char類型數(shù)據(jù)來表達常用字符,隨著計算機在世界范圍的普及,char所能表示的字符已經(jīng)遠遠不夠了,于是有了各種各樣的char類型的擴充,也有了更多的國際碼制標準。

How integers are stored in memory?

實現(xiàn)二進制和十進制的轉(zhuǎn)換是容易的,將十進制整數(shù)a轉(zhuǎn)換為二進制表示所需最小位數(shù)位n,只需n與a之間滿足

。然而為了表示符號位,必須要再多一位來表示符號。這又造成了問題,編碼的時候符號位應該放到哪里?譯碼的時候如何識別符號位?

前人智慧的積累,最終計算機使用一種特殊的編碼方式來儲存整數(shù)。

以最高位(MSB ,most significant bit)作為符號位,MSB=0表示正數(shù),反之表示負數(shù)。這樣的編碼方式不僅易于計算機理解符號,而且其所具有的正負數(shù)特有的補碼關系使得減法運算變得容易。

如上圖,+10用二進制表示為1010,要得到-10只需將1010各位取反然后再加1(即補碼),如果將兩者相加會發(fā)現(xiàn)在有效位數(shù)內(nèi)和為0。(關于補碼建議聽王紅老師的課)。這種編碼方式對計算機是有好的,取反(反向器)加1(加法器)都是可硬件實現(xiàn)的。將負數(shù)以補碼的形式表達將減法運算轉(zhuǎn)換為求和運算,也使得硬件實現(xiàn)變得可能。

以此邏輯,4byte的int型數(shù)據(jù)表示范圍為

~ ,將符號位當作數(shù)值位的unsigned int表示的范圍為 ~ 。

How character is stored in Computer

char型數(shù)據(jù)本質(zhì)上和 int 相同,都是儲存二進制整數(shù)值,在計算機看來,他們僅僅是 size 和 range 不同罷了( int 4字節(jié),char 1字節(jié)),進行運算處理的方式完全一樣。我們常常覺得char和 int 差別很大,因為我們在創(chuàng)建一個char數(shù)據(jù)時更多用于輸入輸出到屏幕或文件,當使用有關函數(shù)時,會對 cha r數(shù)組做特殊處理并且以ASCII碼做相應的轉(zhuǎn)換。char 并不神秘。

ASCII碼是我們最常用的字符碼制了,如果要處理更多字符(例如漢字)的話,還需要去了解國際上更全面的碼制。

How float or double values are stored in memory?

以float(單精度浮點型)為例,分配4字節(jié)(32位)內(nèi)存

由1bit符號位,8bit指數(shù)位和23bit有效位構(gòu)成。

可以看到double和float只是不同部分位數(shù)的區(qū)別,本質(zhì)是相同的,接下來以float為例介紹。

## How to convert floating numbers into binary numbers ?

浮點型數(shù)據(jù)轉(zhuǎn)換為二進制會有些不同,因為小數(shù)部分和二進制并非11對應的,就像0.5無法用2^n^(n為整數(shù))來表示,這就造成了精度問題,相應的便有單精度float和雙精度double數(shù)據(jù)來應對不同的誤差要求。

為了搞明白小數(shù)部分的二進制表示,我們先回顧十進制

e.g. 我們?nèi)绾卫斫?.23

4.23整數(shù)部分為4;4.23小數(shù)部分為0.23;如何獲得小數(shù)點后第一位數(shù)據(jù),只需將其x進制數(shù)0.23x10=2.3我們可得到第一位為2再將0.3x10=3我們得到第二位為3

可以看到將小數(shù)部分每x一次n進制,就會有一次整體的進位。此時得到的小數(shù)點前的第1位即為剛才小數(shù)點后的第一位

同樣的思路操作二進制

e.g.

4.23整數(shù)部分為4--->100; 小數(shù)部分為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

顯然我們得到了一個無限不循環(huán)小數(shù)100.001110.....

這樣我們就把浮點類數(shù)據(jù)表示成了二進制數(shù)據(jù)

## Make the converted binary number to normalize form

為了在計算機中儲存這些數(shù)據(jù),我們需要將其規(guī)范化,一般化

如上例子100.001110.......=1.00001110....x2^2^

其中1.100001110....為significant bit,將決定浮點數(shù)的精度

2^2^(*指數(shù)那個2*)為exponent bit,將決定浮點數(shù)的范圍

我們終于表達了浮點數(shù)的大小(*鼓掌*)

然而如何表示負值,浮點數(shù)是沒有補碼反碼這種操作的。同樣的以MSB的取值來表示符號,特殊的是,將exponent bit在加上

,即添加一個較大的正數(shù)部分使之無論正負均為正值。如上例子1.00001110....x ,其exponent bit最終結(jié)果為 +1=129.

由于我們采用科學計數(shù)法(*我想應該是這么稱呼的吧*)表示,而且是二進制只有0和1,那么形式總會是1.xxxxx,無需浪費一位來表示小數(shù)點之前的1,所以在計算機儲存浮點類型數(shù)據(jù)時,是不會儲存這一位的。

0.75在計算機中的儲存形式。

根據(jù)這個儲存方式不難得出,float的最大精度為

,可表示最大數(shù)值為 。

note:**關于這樣表示浮點數(shù)據(jù)的原理及其計算和輸出輸出方法我還沒搞明白,我再研究研究再寫吧,當然希望已經(jīng)搞明白的小伙伴分享一下啦**

一只小白猿,技術超有限......

還望小伙伴能指出小白猿的錯誤,一起學習,一起分享

微信掃描二維碼關注小白猿啦

總結(jié)

以上是生活随笔為你收集整理的c语言科学计数法_C入门:C语言中数据的储存(上)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。