【字元編碼】
在電腦系統中,所有的資料都經過編碼進行處理。在電腦中有多種編碼方式,最常見的有:
1、無符號編碼: 基於二進位的編碼,表示大於0或者等於0的數字
2、二進位補碼:表示有符號整數的最常見形式。 可以表示負數、0、正數
3、浮點數編碼:以2為基的表示實數的科學計數法;
浮點數的可以這麼認為: 尾數*2^冪; 通過這個運算式我們可以基本看到浮點數在電腦中的儲存模式。
例如:在C語言中float型實數,
Bit15.....bit9 bit8......bit0
bit15-bit9可以用來表示尾數,而Bit8....Bit0則可以表示2的冪次,然後通過系統換算就可以將這樣表示的
浮點數換算成十進位的浮點數, 【Float x】bin——>【Float x】dec
【編碼的屬性】
設計一種編碼系統必須要實現各種屬性:
1、表示的範圍
2、算數運算的屬性,或者說可以實施的操作
3、系統中的位級的表示,也就是儲存模式
【進位】
常見的有二進位、十進位、八進位、十六進位;日常生活中多用十進位,電腦系統多用二進位和十六進位。
【字】
在電腦系統中,用字長表示整數和指標的標稱大小;通常全字長與資料匯流排和地址匯流排有關。
字長為n的電腦可以訪問的地址空間為0——2^n-1,程式最多可以訪問2^n位元組。
註:
我記得在學習微機原理的時候,裡面說到字長的概念,如下所示:
書名:微電腦原理與介面技術(第三版)周荷琴 中國科學技術大學出版社
而我看《深入理解電腦系統》則是這麼說的:
書名:《電腦_深入理解電腦系統].(美)Randal.E.Bryant&Davic.O.Hallaron.掃描版》
這個地方就讓我迷惑了,因為這兩個概念風馬牛不相及,那麼我們該怎麼看呢?
直接看上下文吧。
【資料類型大小】
short int: 一般系統兩個位元組
int:一般是四位元組,
long int:一般取全字長,也就是說sizeof(long int)一般是與表示系統地址線的寬度相同;這個也與OS的設計或者編譯器的設計有關
float:一般是四個位元組
double:一般是八個位元組,雙精確度
char *:全字長
C標準對各個資料類型的下界做了規定,但是沒有對上界做規定;一般要求int的範圍不比short int小,long int不比int範圍小。
【定址和位元組順序】
對於程式裡訪問的對象,我們需要關注的有:儲存物件的地址、多位元組對象的位元組順序以及儲存的內容;單位元組一般關注儲存地址和儲存的內容即可;
例如對於char型資料對象,我們一般關注資料對象的地址和內容即可,不需要關注對象位元組的儲存方式。
多位元組對象一般按照下面方式處理:儲存為連續的位元組序列, 多位元組中對應的最小地址為對象的地址。
例如我們有int(32位)型資料對象:
int nTest;
則nTest佔用4個位元組,如:
資料對象nTest佔用連續的位元組0x100、0x101、0x103、0x104,且其地址為0x100.
說到這個地方我們不能不說的一個電腦中基本的概念:小端和大端。
假設我們有一個佔用W位的對象,用二進位表示為【Xw-1,Xw-2,Xw-3.......X3,X2,X1,X0】,W為八的倍數,那麼在儲存的過程中,這些位就
被分成位元組組,每8位為一組,【Xw-1,Xw-2,Xw-3......Xw-8】為最高有效8位MSB,而【X7.....X2,X1】為最低有效8位LSB,由於電腦的
儲存基本單元室位元組(8位),這樣儲存MSB、LSB等其他位就會有一個前後順序,可能有兩種可能。如所示:
小端:用十六進位表示時,權值大的部分放在地址的高端部分,就是如的方式2
大端:用十六進位表示時,權值大的部分放在地址的低端部分,如的方式1;大端標記法與自然數字表示相同,即數字在電腦中的儲存按照
習慣書寫方式的方向儲存。
大端和小端一般不影響程式的讀寫和顯示,但是在位元組塊通訊的時候,會影響發送和接受方解釋數值的大小;同時當使用強制類型轉換後的位元組
的讀取。
例如:0xFBCA_13B4
其小端儲存模式儲存形式為: B4 13 CA FB
大端儲存模式儲存形式為: FB CA 13 B4
目前大多數的IBM、Motorola和Sun Microsystem採用的是大端儲存法,而Intel的以及PC相容微機採用的小端法;而且有些電腦可以工作
在大端和小端,具體工作在什麼模式則取決於系統加電時規定的儲存規則。
【字串】
在C語言標準中字串是連續字元序列,並且字元序列的最後是Null 字元'\0',字串的長度不包括最後的控制符'\0';在很多時候用null表示'\0';
為了這樣表示可以定義一個宏:
#define null ('\0') //這裡需要注意NULL和null具有不同的性質,雖然在數值上是相等的
特別地定義:
#define NULL ((void *)0) //這裡0具有指標的特性
字串從技術上可以看作是字元數組,其在電腦中是連續儲存的,儲存地區的最低地址儲存的是字串的首字元。
最常見的字元編碼方式是ASCII編碼方式。
Tip: 十進位的0、1、2......9,正好對應十六進位的編碼的0x30、0x31.....0x39; 即數字0的ASCII碼值為(48)dec。
字串用雙引號引用,例如:字串"abc"、Null 字元串"";
字串支援串連,例如: "abcdefg""hijk" 則表示字串"abcdefghijk"
字串本身返回其儲存首地址;例如char* strTest="abc"; 則我們可以利用strTest引用字元內的字元以及字串。
---恢複內容結束---