我們如果對c語言里數據是如何存儲的不清楚的話,就會導致我們對程序的理解越來越困難。說白了c語言就是人與機器交流的一種規則,而機器和芯片能明白的只能是0和1這兩種高低電平。他們什么也不懂。只是一堆模擬電子和數字電路板集合。那人們怎么會操作這些破玩意兒呢?剛開始人們真的是010101的通過打孔來操作的。后來,人們學聰明了有了匯編又有了c語言、c++、java等等工具。其實每一個語言體系只是一些操作機器的規則而已。你遵守了這個規則就會成為編程高手。
拿c的字符型來說吧,為什么c要分字符型、int型?原因很簡單,就是為了更方便的管理數據存儲。事實上不管字符還是數據在計算機中都只能用01來表示,那我們怎么能區別他們的不同呢。就用多位的01來表示,一個不夠用兩個,我們知道用7個01就可以有128個數字被表示,也就是說用幾個01就可以表示2的幾次方個數字。於是人們提出了ASCII 碼(查了百度百科,這樣說:在計算機中,所有的數據在存儲和運算時都要使用二進制數表示(因為計算機用高電平和低電平分別表示1和0),例如,象a、b、c、d這樣的52個字母(包括大寫)、以及0、1、2等數字還有一些常用的符號(例如*、#、@等)在計算機中存儲時也要使用二進制數來表示,而具體用哪些二進制數字表示哪個符號,當然每個人都可以約定自己的一套(這就叫編碼),而大家如果要想互相通信而不造成混亂,那么大家就必須使用相同的編碼規則,於是美國有關的標准化組織就出台了所謂的ASCII編碼,統一規定了上述常用符號用哪些二進制數來表示。
計算機中的字符包括數值、英文字母、標點符號、制表符號及其他符號。每一個字符都用一個特定的二進制代碼來表示,這就是字符的編碼。目前,字符編碼采用的是美國信息交換標准代碼,即ASCII 碼 。它是用一個字節的低七位來表示一個字符的編碼, 2^7 =128 ,最高位是 0 ,所以,用 ASCII 碼可表示 128 個字符)。有了這個我們就不怕我們輸入的字符,計算機不懂了。於是只要我們自己在程序中輸入一個字符(例如:‘a’)計算機在編譯過程中自動將它轉換成97的二進制碼,這就是為什么說字符本質上也是整型了,因為字符變量只是告訴計算機,我這個數據只占一個字節,也就是說我超不出128這個數去。而int則告訴我這個數可能很大,有65534那么大呢。
下面就說說為什么字符減'0'可以到相應的整數。現在比如我們要字符‘1’轉換成數字1,就這么一個變化,我們看到了大家注意了字符型常量用''括起來的原因是,它們在計算機中都以各自的ASCII表示。而‘1’的對應編碼是49的二進制碼,但是我們的數字1,就等於1呀,所以為了由原來的‘1’實際上就是49的二進制變成現在的1對應的二進制1,只好用49-48=1了。但是在ASCII碼里‘0’對應的剛好是48的二進制碼,所以我們轉換的時候只需要‘1’-‘0’=1;就可以了。而數字的ASCII碼是按順序規定的。所以其它字符要轉換成數字都可以用減‘0’來表示。比如‘2’的ASCII是50,而我們要得到數字2,於是用‘2’-48=2了。看來當我們知道數據在計算機中的存儲規則的時候,問題就迎刃而解了。
大小寫字母的轉換:先看ASCII碼:a~z是97~122的二進制,而A~Z是65~90的二進制編碼,於是我們就得出:大寫字母=小寫字母-32 ;這個公式了。當然這里的32我也可以這么寫‘Z’=‘z’-'空格'。因為空格的ASCII碼是32對應的二進制編碼。