論字節(jié)集加&密 #2 數(shù)據(jù)類型之間的秘密

????上期講了字節(jié)的規(guī)格和字節(jié)集內單獨字節(jié)的處理方法,這期我們來講字節(jié)與文本的轉換,字節(jié)數(shù)據(jù)在與文本的轉換是會跟照編碼來找字符的樣子,比如字節(jié)集 {255,0,0,0} 在到字節(jié)集中使用255的整數(shù)便可以達到,但如果我們把數(shù)據(jù)放到256,便會發(fā)現(xiàn),數(shù)據(jù)進階了!
字節(jié)集數(shù)據(jù)變?yōu)榱耍簕0,1,0,0}?
由此我們可以看出如果直接將整數(shù)數(shù)據(jù)轉換為字節(jié)集的話會得到的是整數(shù)的存儲結構,所以易語言中整數(shù)的存儲是4個字節(jié)的存儲,而一個字節(jié)占8bit,所以整數(shù)型能夠占32Bit的長度,超出這個長度就意味著大家都知道的溢出了!通過計算 255*255*255*255?我們可以知道這個整數(shù)型的最大存儲數(shù):4,228,250,625?在很多時候這個長度足夠大家使用了,但有時候卻不夠用這時候長整數(shù)等就可以來替代整數(shù)型。
? ? (長整數(shù)可以達到8個字節(jié),也就是64Bit的存儲長度)
????剛才我們運算的都是正整數(shù),那如果是負整數(shù)呢?剛才我們計算出來的其實是整數(shù)型的最小數(shù)到最大數(shù)的長度,那么兩頭的最大值,是由-2,147,483,648~2,247,483,647;
這就比較玄學,我們剛才把四個字節(jié)填滿得到的是4,228,250,625,而這兩頭的長度加起來并沒有和剛才我們填滿的數(shù)字有多少相似。因為整數(shù)型并不是把每個位都填為255就可以計算出最大值,真正的計算方程應該是這樣的,UP主總結了一下 :假如這是一個32Bit的整數(shù)數(shù)據(jù),那么他的計算方式 就是 -2^(32-1)~2^(32-1) 在有符號位的整數(shù)中我們在最大值需要-1 例如:[2^(32-1) ]-1,無符號位的整數(shù)型的最大值就是 2^(32-1),公式就是 2^(占位長度-1);
????那么短整數(shù)和長整數(shù)的取值范圍通過計算我們可以得知為:
短整數(shù) -32768~32768????長整數(shù) -9223372036854775808~9233372036854775807
????剛才說了有符號位和無符號位,這兩種其實屬于補碼,補碼具體可以參考:https://baike.baidu.com/item/%E8%A1%A5%E7%A0%81
由于這種站位的出現(xiàn),存儲的數(shù)值數(shù)據(jù)可以分為正數(shù)和負數(shù),具體運算方法在上面這個網(wǎng)站也可以找到,那么數(shù)值與字節(jié)集就講到這里,再講究偏題了。
????接下來我們講一下文本轉成的字節(jié)集,在 到字節(jié)集() 中直接填數(shù)字的話,就等于把一個數(shù)值扔了進去,注意,這里是數(shù)值不是文本,在字符串的存儲方式中,一個字符只有一個字節(jié)或兩個字節(jié),為什么存儲的字節(jié)不同,這就是語言的差異,很多語言的存儲字節(jié)是兩個字節(jié),而英語的組成方式是26字母,在傳統(tǒng)的ASCII表中只有最常見的鍵盤上的字符,還有一些空白的字符,具體是什么可以去ASCII表中查看,那么ASCII表中沒有中文,是怎么解決的?這就考慮到了添加編碼的重要性,就拿易語言來說,其顯示方式通過的就是Ansi編碼,如果你將一段Unicode的數(shù)據(jù)復制到Ansi顯示的編輯框中,顯示出的就是亂碼,通過編碼轉換,我們可以在Ansi的編輯框中編輯Unicode的文本,當然也可以在Unicode的編輯框中編輯Ansi的內容,當然在于兩種編碼的差別,Unicode的很多字符在Ansi表中是無法找到的,所以這種問題時我們必須更改顯示文本的控件的編碼和原編碼一樣。當然在不同的編碼中,有的字符的存儲位也是不一樣的,這里UP為了省鍵盤,就簡單的給大家舉一個栗子:在Ansi也可以說GBK編碼中漢語中的一個字符,例如“中”,是占兩個字節(jié)的,而在Unicode編碼(可以說UTF-8)中占用的是三個字節(jié)。但Unicode是要比Ansi龐大的,所以很多地方用的都是Unicode編碼,而不是Ansi編碼,當然易語言這點缺陷也是可以通過代碼來修補的,例如:編碼轉換()
????最后還有一種類型,那就是邏輯型,這里UP幫大家測試了一下,在到字節(jié)集中真的字節(jié)集結構是{1,0,0,0} 而假的字節(jié)集結構是 {0,0,0,0} 可以看到兩者的首數(shù)字是不一樣的,在其他很多IDE中使用的也會是 0 / 1 來代替真假,而在易語言中可以使用另一種方式來將真假轉換為兩位的字節(jié)集數(shù)據(jù),那就是 先將邏輯型的數(shù)據(jù)轉換為文本,然后再轉換為字節(jié)集,這時候我們發(fā)現(xiàn):真{213,230} 假{188,217} 變成了在GBK編碼中的字符,如何在GBK中找到呢?首先我們將兩個字節(jié)分別轉換為16進制,拿真來說 DEC:213=HEX:D5;DEC:230=HEX:E6 ,然后將他們拼合,我們就得到了D5E6,在GBK編碼中對應的,我們能找到 真 這個字符,那么D5E6的十進制并不是213230,也不是213+230,所以在反過來的轉換中,我們還需要將這個字符拆成兩份,再轉換為十進制就得到了 213 和 230 兩個數(shù)字,我們將這兩個用字節(jié)的方式存到一個字節(jié)集中,然后在易語言中的編輯框(因為這個編輯框是Ansi編碼的)顯示這個字節(jié)集轉換為的文本,就可以得到我們的"真","假"也是同理;