資料在計算機中是以二進位制補碼的形式儲存的。不同的資料型別有不同的補碼形式。下面分別就資料型別和資料的存放、讀取討論。
一.資料的型別
資料型別分為原生資料型別和自定義資料型別。
(1)原生資料型別(內建型別):包括我們常用的int、char、short、long、float、double.
說明:整型家族有char、int、long、short,它們又分為有符號型別(signed)和無符號型別(unsigned).其中,char型別
的資料佔1個位元組,int型別的資料佔4個位元組,short型別的資料佔2個位元組,long型別的資料佔8個位元組。
(2)自定義資料型別:包括結構體型別(struct)、聯合體型別(union)、列舉型別(enum)等。
資料型別的意義:定義乙個變數,我們通常要說明它的型別。而在定義乙個變數時,記憶體就為它開闢乙個空間。那麼,記憶體是怎麼開闢空間的呢?沒錯,這就要發揮型別的作用了。所以,型別決定了記憶體開闢空間的大小,還決定了使用的空間。此外,在之後對資料的操作中,我們總要結合資料的型別而參考對資料的操作,所以,型別還決定了我們如何看待所開闢空間的視角。
注意:void(空)型別不能定義變數,因為記憶體為空型別所開闢的空間不確定。但是,void *可以用來定義乙個指向空型別的指標。因為,所定義的是指標型別,在32位處理器上,記憶體為指標變數開闢4個位元組大小。(即所開闢記憶體空間大小所確定)
二.資料的存放和讀取
存放:不論是有符號數還是無符號數,它們都是以二進位制補碼的形式存放的。只不過它們的補碼形式求法不同。對於無符號數和有符號整數來說,它們的補碼就是它們的二進位制序列。有符號數有符號位,符號位就是最高位。正數的符號位是0,負數是1.對於有符號負數來說,我們通常先寫出它的原碼(符號位是1,其它位按照它的絕對值二進位制序列來寫。),然後通過原碼寫出補碼(符號位不變,其餘位按位取反),最後再在末位+1得到補碼。
讀取:在讀取資料時,我們要先看它是什麼型別,然後判斷型別是有符號數還是無符號數。如果是無符號數,直接讀取,把二進位制數轉化為十進位制、八進位制、十六進製制等。如果是有符號數,先看最高位是1還是0(是負數還是整數),如果是0,則讀法與無符號數相同;如果是1,則與有符號負數儲存相反,先在末位上減1,然後除符號位外,其它位按位取反。
下面請看幾個例題:
分析:在這裡定義了三個變數a,b,c,其中a和b都是有符號char型,c是無符號char型。在這裡要以十進位制有符號整型輸出a,以無符號整型輸出b,以有符號整型輸出c.其中,a,b,c都佔1個位元組,但輸出時的整型都佔4個位元組,所以要進行型別提公升。即新增符號位。根據上面的資料存放,我們很容易知道a,b,c在記憶體中的儲存都是11111111.新增符號位根據資料原有的型別,無符號數新增0,有符號數新增符號位。所以在a前面要新增24個1,b前新增24個1,c前新增24個0.所以它們變為:
a:1111 1111 1111 1111 1111 1111 1111 1111
b:1111 1111 1111 1111 1111 1111 1111 1111
c:0000 0000 0000 0000 0000 0000 1111 1111
下面進行讀取:
a以有符號輸出,那麼先看符號位,最高位是1,所以a是負數,然後以負數來讀取
a:1111 1111 1111 1111 1111 1111 1111 1111
-1:1111 1111 1111 1111 1111 1111 1111 1110
取反:1000 0000 0000 0000 0000 0000 0000 0001 -->-1
b以無符號整型輸出,所以不用看符號位,直接進行讀取。
c以有符號十進位制輸出,也要看其符號位。最高位是0,所以是正數,讀取時直接根據二進位制序列讀。
例2:
分析:有符號char型的數值取值範圍是:-128~127。128表示為二進位制序列是1000 0000.而在有符號char型中,-128也是這樣表示的,所以在記憶體中,a認為這裡的128就是-128,符號位是1.然後要以無符號整型輸出。同樣進行型別提公升,a前面加24個1,變為:1111 1111 1111 1111 1111 1111 1000 0000
例3:
分析:首先定義了乙個有符號字元陣列a,有符號char型的取值範圍是:-128~127.然後對a[i]用迴圈賦值。最後輸出a的長度。在這裡,要注意字元陣列長度以'\0'為標誌,其實這裡的0就等價於'\0'。所以我們只要計算出當i等於何值時,a[i]=0,就可以知道陣列a的長度。下面先一次計算:
i=0時,a[0]=-1;i=1時,a[1]=-2;............i=127時,a[127]=-128;
i=128時,a[i]=-1-128=-1+(-128)
-1:1111 1111
-128:1000 0000
和 : 10111 1111
但是只能取後8位,即0111 1111=127,所以a[128]=127;
i=129時,a[129]=-1+(-129)
-1:1111 1111
-129:1 0111 1111
和: 1 0111 1110 同理,只取後8位,即為0111 1110,所以a[129]=126.
同理:a[130]=125,a[131]=124,.........a[255]=0,所以a共有256個元素,且最後乙個元素是0,所以a的長度是256-1=255.
三.浮點數的訪問
浮點數分為單精度float型和雙精度double型,分別佔4個位元組和8個位元組。在這裡,我們先討論單精度float型,double型類似。
1.float型:
存:我們知道,十進位制小數可以化為科學計數法,同樣,二進位制也可以化為科學計數法:(-1)^s*m*2^e。其中s是符號位,取值是0和1;m是有效數字,取值範圍在大於等於1和小於2之間;e是指數字。所以,我們儲存float型的資料,實際上就是對e、s、m的儲存。對於float型,共佔4個位元組,有32個位元位。其中,最高位存放符號位即s,接下來的8個位元位存放指數字e,剩下的23個位元位用來儲存有效數字m.由於e是無符號整型,取值在0~255之間,但其實科學計數法中的e可以是負數,所以我們在存放的時候通常要給原來資料的指數字加上127。規定:計算機內部儲存m時,預設這個數字的第一位總是1,因此可以被捨去,只儲存後面的小數部分。等到讀取的時候再自動加上1.這樣就可以節省1位有效數字,對float型來說,留給m只有23位,將第一位的1捨去後,等於可以儲存24位有效數字。
取:根據存放的二進位制序列,我們可以把資料表示為科學計數法的形式,然後自覺給指數字減去127,有效數字部分加上1,就能夠得到原有資料的二進位制序列。
2.double型:
存:先將原有資料化為科學計數法。由於double型資料共佔8個位元組,64個位元位。所以,它在儲存時的精度就叫float型高。其中,最高位s是符號位,值為0或1;接下來是指數字e,占有11個位元位,最後是有效數字部分,佔52個位元位。e的取值範圍是0~2^11-1(2047)。在存時,也要給資料原有的指數字加上中間數1023。
取:同float資料一樣,在把二進位制數寫成科學計數形式後,自動給指數部分減去1023,有效數字部分加上1.再轉化為相應的進製數。 例:
分析:pfloat指標是乙個指向float型的指標變數,那麼*pfloat的值理論上應該是9.000000,怎麼會輸出0.000000?
9在記憶體中的儲存為:0000 0000 0000 0000 0000 0000 0000 1001,在讀取時看作浮點數儲存。根據上面的取法,這個float型的資料符號位是0,緊接著的8位0000 0000是加過中間數127之後的指數部分,後面的0000 0000 0000 0000 0001 001是除去1後的有效數字部分,所以原有資料的科學計數表示為:
(-1)^0*1.00000000000000000001001*2^(-127),約等於0,所以輸出為0.000000。
後來把*pfloat的內容賦值為9.0,因為9.0=(-1)^0*1.00100000000000000000000*2^3,符號位是0,指數字是3+127=130,二進位制為:1000 0010,有效數字部分表示為:0010000 0000 0000 0000 0000,所以9.0在記憶體中的二進位制序列是0 1000 0010 0010000 0000 0000 0000 0000,然後以十進位制輸出即為1091567616.
整型資料儲存
1 include int main 1000 0000 0000 0001 1原始碼 1111 1111 1111 1110 1反碼 1111 1111 1111 1111 1補碼 對於a,按位提公升,看的是當前位元位的型別,所以按位提公升將變為1111 1111 1111 1111 1111 1...
Python JSON格式資料的儲存與讀取
模組json可以將python資料結構轉儲到檔案中,並在程式再次執行時載入該檔案的資料 儲存 json.dump 函式json.dump 接受兩個實參 要儲存資料 可用於儲存資料的檔案物件 讀取 json.load import json 如果以前儲存了使用者名稱,就載入它 否則,就提示使用者輸入使...
Python Json儲存與讀取
python 中的檔案資料儲存和讀取可以說是非常方便了,這裡記錄一下 json 資料的儲存和讀取,需要用到的模組就是 json,該模組能夠將簡單的 python 資料結構轉儲到檔案中,並在程式再次執行時載入該檔案中的資料,還可以使用 json 在 python 程式之間分享資料,更重要的是,json...