數據類型和字符集

什麼是數據類型
簡單理解就是數據的類型。
what?數據怎麼會有類型?數據難道不就是0或者1組成的字節碼嗎?
沒錯,在計算機中,只能存儲0或者1,也就是說從存儲的角度來看,根本沒有類型這種東西,它們確實不過就是0或者1組成的字節碼。
那爲何還會有數據類型?
由於,類型是至關於編程者(人)來講的,人把數據分紅不一樣的類型,方便理解,方便計算。
好比:編程

int a = 0x61;
 char b = 0x61;
 float c = 0x61;
 double d = 0x61;
 System.out.println(a+" "+b+" "+c+" "+d);

輸出結果是:97 a 97.0 97.0。
四個不一樣類型的變量,給與相同的字節碼0x61,可是輸出居然不一樣!why?
由於編程者(人)給0x61這個16進制數賦予了類型,或者說給它賦予了含義。
爲何要賦予類型(含義)?是爲了讓0或1的字節碼可以表示更具體的東西,或是說把它映射爲人能理解的東西。
不設置類型,也能夠對0x61這個數進行各類運算,可是。。。what is the meaning?
沒有意義,對於一個整數進行加減乘除具備現實意義,對於一個字符小寫變大寫具備現實意義,但是對於一個二進制數的操做倒是沒有意義的。人不能理解的事情是沒有意義的。編碼

那麼什麼是數據類型?
就是人看待數據的方式,人理解數據的方式,人規定數據的方式,這就是數據類型。
數據之因此有類型,那取決於人的見解,而不卻決於數據自己,數據自己是沒有類型的。code

爲何上面程序的輸出不一樣?
由於輸出就是把數據變成人想要的格式顯示給人看。
計算機怎麼知道人想要什麼格式?經過數據類型!
當0x61被規定爲int型時計算機就知道應該顯示十進制數6*16+1 = 97。
當0x61被規定爲char型時計算機就知道應該顯示十進制數6*16+1 = 97表明的ascii碼所對應的字符'a'。
雖然它們在計算機中都是同一個字節碼0x61,可是由於人規定了類型,因此計算機才返回不一樣的結果。utf-8

從編解碼的角度來看
編碼是信息從一種形式或格式轉換爲另外一種形式的過程,解碼,是編碼的逆過程。
具體來說編碼就是,把人理解的東西轉換爲計算機理解的東西,而解碼則是把計算機理解的東西轉換爲人理解的東西。
計算機理解什麼?只理解0和1,人呢?almost everything。
它們之間轉換的橋樑是什麼?就是數據類型!人只有規定了數據的類型,規定人所理解的事情如何轉換爲計算機理解的字節碼,才能完成這種轉換!
舉例:
對於97這個數字,人能夠理解它爲一個十進制數,可是計算機只能理解0或者1,那麼如何讓計算機理解?
給97編碼。how?若是用二進制編碼,則把97變成了1100001這個數。這樣計算機就理解(能存儲和計算)了,那麼人怎麼理解1100001這個二進制碼呢?計算機在顯示的時候把1100001這個數進行二進制解碼,解碼成97,人就理解了,而之因此能轉換,是由於規定了二進制編碼解碼的規則,而且規定了它是個整數。而對於'a'這個字符,人理解爲它是一個小寫字母a,如何讓計算機理解?仍是編碼?編什麼碼?編ASCII碼,'a'的ASCII碼是1100001,這樣計算機又理解(能存儲和計算)了,計算機如何讓人理解1100001,解碼!ASCII解碼,就變成了'a',這樣人就又理解了!。ci

不一樣的事物,使用不一樣的編碼方式可能獲得相同的二進制碼,而相同的二進制碼,使用不一樣的解碼方式會被理解爲不一樣的事物!字符串

從本質上來說什麼是數據類型?
其實就是數據的編解碼的方式!!!get

最後,什麼是字符集?
就是對字符的編碼解碼的方式!
不一樣字符集,規定了字符的編碼(字符轉換爲二進制數)和解碼(二進制數轉換爲字符)方式。變量

System.out.println("你好".getBytes("utf-8") );
System.out.println("你好".getBytes("gbk") );

輸出:
[B@677327b6
[B@14ae5a5
能夠看到不一樣的字符集(utf-8和gbk)把相同的中文"你好",編碼成了不一樣的二進制碼。
固然,上面輸出並非0和1,顯然不是二進制碼。。。那是由於計算機顯示的時候把二進制碼使用ASCII碼幫你解了碼。。。都變成了ASCII字符。why?我並不想讓它解碼,可是顯示就是解碼!!!
固然經過一些技巧能夠輸出二進制的字符串,可是這個不是重點,這裏就不給出了。技巧

最後的最後
計算機最先在什麼領域應用了編解碼?
彙編語言!
計算機命令也是二進制碼,把彙編語言的英語單詞變成二進制碼就是編碼,而把二進制碼變成彙編語言的單詞就是解碼!數據類型

相關文章
相關標籤/搜索