c# 基本類型存儲方式的研究

基本單位

二進制,當前的計算機系統使用的基本上是二進制系統。
二進制的單位是位,每一位能夠表示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 類型

說到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}"));
        }
將Byte[]轉化爲二進制字符串

二、c#中的數字類型設計

數字的存儲方式有兩種,大端和小端,C#使用小端,若是跨語言交互,須要考慮轉換。

具體見百度百科:

https://baike.baidu.com/item/%E5%A4%A7%E5%B0%8F%E7%AB%AF%E6%A8%A1%E5%BC%8F/6750542?fromtitle=%E5%A4%A7%E7%AB%AF%E5%B0%8F%E7%AB%AF&fromid=15925891&fr=aladdin

相關文章
相關標籤/搜索