二進制,當前的計算機系統使用的基本上是二進制系統。
二進制的單位是位,每一位能夠表示2個數: 0或1。
byte(字節) 有8位,能夠表示的數爲2的8次方,即256個數,範圍爲【0-255】。html
下面是本身整理的C#類型大小,若是存在錯誤,望指正。
int 有32位,能夠轉化爲byte[4]。能夠表示 4,294,967,296(2的32次方的)個數字,範圍爲【-2,147,483,648,2,147,483,647】c#
說到char類型,首先必須考慮編碼,不一樣的編碼方式對應不一樣的字符。這裏的編碼方式屬於文字編碼。ide
字符串編碼是字符和數字的對應關係。一個數字對應一個字符,一個字符對應一個數字。測試
這個東西源遠流長,說清楚不太容易,感興趣的能夠看這篇文章:
https://www.cnblogs.com/criedshy/archive/2012/08/07/2625358.html編碼
只說幾點:
一、Unicode是國際組織制定的能夠容納世界上全部文字和符號的字符編碼方案。不包括實現。
二、UTF32,UTF7(被淘汰),UTF8,UTF16是Unicode的實現方式。
三、C#中的UniCode指的是UTF-16spa
四、設計
下面是一組測試code
public void StartTest() { Console.WriteLine("Char編碼的探討"); TestOneEncode("ascii"); TestOneEncode("gb2312"); TestOneEncode("unicode"); TestOneEncode("utf-8"); TestOneEncode("utf-16"); TestOneEncode("utf-32"); } private static void TestOneEncode(string encodeName) { Encoding encoding = Encoding.GetEncoding(encodeName); Console.WriteLine($"'a'使用 {encodeName} 編碼,每一個字節對應的數字爲:{ string.Join(",", encoding.GetBytes(new[] { 'a' }))}"); Console.WriteLine($"'a'使用 {encodeName} 編碼,再使用 {encodeName} 解碼,獲得:{ encoding.GetChars(encoding.GetBytes(new[] { 'a' }))[0]}"); Console.WriteLine($"'、'使用 {encodeName} 編碼,每一個字節對應的數字爲:{ string.Join(",", encoding.GetBytes(new[] { '、' }))}"); Console.WriteLine($"'、'使用 {encodeName} 編碼,再使用 {encodeName} 解碼,獲得:{ encoding.GetChars(encoding.GetBytes(new[] { '、' }))[0]}"); Console.WriteLine($"'中'使用 {encodeName} 編碼,每一個字節對應的數字爲:{ string.Join(",", encoding.GetBytes(new[] { '中' }))}"); Console.WriteLine($"'中'使用 {encodeName} 編碼,再使用 {encodeName} 解碼,獲得:{ encoding.GetChars(encoding.GetBytes(new[] { '中' }))[0]}"); Console.WriteLine(); }
下面是輸出htm
Char編碼的探討
'a'使用 ascii 編碼,每一個字節對應的數字爲:97
'a'使用 ascii 編碼,再使用 ascii 解碼,獲得:a
'、'使用 ascii 編碼,每一個字節對應的數字爲:63
'、'使用 ascii 編碼,再使用 ascii 解碼,獲得:?
'中'使用 ascii 編碼,每一個字節對應的數字爲:63
'中'使用 ascii 編碼,再使用 ascii 解碼,獲得:?blog
'a'使用 gb2312 編碼,每一個字節對應的數字爲:97
'a'使用 gb2312 編碼,再使用 gb2312 解碼,獲得:a
'、'使用 gb2312 編碼,每一個字節對應的數字爲:161,162
'、'使用 gb2312 編碼,再使用 gb2312 解碼,獲得:、
'中'使用 gb2312 編碼,每一個字節對應的數字爲:214,208
'中'使用 gb2312 編碼,再使用 gb2312 解碼,獲得:中
'a'使用 unicode 編碼,每一個字節對應的數字爲:97,0
'a'使用 unicode 編碼,再使用 unicode 解碼,獲得:a
'、'使用 unicode 編碼,每一個字節對應的數字爲:1,48
'、'使用 unicode 編碼,再使用 unicode 解碼,獲得:、
'中'使用 unicode 編碼,每一個字節對應的數字爲:45,78
'中'使用 unicode 編碼,再使用 unicode 解碼,獲得:中
'a'使用 utf-8 編碼,每一個字節對應的數字爲:97
'a'使用 utf-8 編碼,再使用 utf-8 解碼,獲得:a
'、'使用 utf-8 編碼,每一個字節對應的數字爲:227,128,129
'、'使用 utf-8 編碼,再使用 utf-8 解碼,獲得:、
'中'使用 utf-8 編碼,每一個字節對應的數字爲:228,184,173
'中'使用 utf-8 編碼,再使用 utf-8 解碼,獲得:中
'a'使用 utf-16 編碼,每一個字節對應的數字爲:97,0
'a'使用 utf-16 編碼,再使用 utf-16 解碼,獲得:a
'、'使用 utf-16 編碼,每一個字節對應的數字爲:1,48
'、'使用 utf-16 編碼,再使用 utf-16 解碼,獲得:、
'中'使用 utf-16 編碼,每一個字節對應的數字爲:45,78
'中'使用 utf-16 編碼,再使用 utf-16 解碼,獲得:中
'a'使用 utf-32 編碼,每一個字節對應的數字爲:97,0,0,0
'a'使用 utf-32 編碼,再使用 utf-32 解碼,獲得:a
'、'使用 utf-32 編碼,每一個字節對應的數字爲:1,48,0,0
'、'使用 utf-32 編碼,再使用 utf-32 解碼,獲得:、
'中'使用 utf-32 編碼,每一個字節對應的數字爲:45,78,0,0
'中'使用 utf-32 編碼,再使用 utf-32 解碼,獲得:中
一、若是上面用將byte轉化爲數字以爲不直觀,也能夠用下面的代碼轉化爲二進制來看。
private static string ConvertToBinaryString(byte[] bytes) { return string.Join(",", bytes.Select(c => $"{c / 128}{c % 128 / 64}{c % 128 % 64 / 32}{c % 128 % 64 % 32 / 16}{c % 128 % 64 % 32 % 16 / 8}{c % 128 % 64 % 32 % 16 % 8 / 4}{c % 128 % 64 % 32 % 16 % 8 % 4 / 2}{c % 128 % 64 % 32 % 16 % 8 % 4 % 2}")); }
二、c#中的數字類型設計
數字的存儲方式有兩種,大端和小端,C#使用小端,若是跨語言交互,須要考慮轉換。
具體見百度百科: