在學校老師就教1byte = 8bit,一個Byte在內存中占8個房間、每個房間都有門牌號、找到內存中的內容就找門牌號,尋址什么的,雖然在聽,但是腦袋里一頭霧水,到現在只知道會用就行,但原理也不是那么明白。
這里我記錄下到現在我自己的理解,我知識有限,若有錯誤請見諒並指出,一起學習:
首先:計算機內部是只認識高低電平的,也就是二進制里的0和1,所有的字符串數據最終都是轉換成0和1的形式存放在內存里的。
1bit就只能存放一個0或者是1,一個Byte用8個Bit表示,比如說:
0: 0000 0000 // 每位表示一個bit 1: 0000 0001 2: 0000 0010 3: 0000 0011 4: 0000 0100 ...... // 以此類推
255:1111 1111 // 11111111為最大值 十進制255
所以說Byte的的范圍為0到255之間的數字。
delphi中的Integer表示4個Byte,32個bit長,int64表示8個Byte,64個bit長,這個已經很長了,足夠滿足需求。
這些Byte也只能表示0到255之間的十進制數字,那如果是N個Byte就需要用Byte的數組來表示了,稱之為TBytes或array of byte,這兩個byte數組效果一樣都是動態數組,在使用時,需要SetLength(a, length), 還有一個是靜態數組,定義方法為array[0..9] of byte,效果都是一樣。
比如在delphi里用TBytes顯示256:
var bs: TBytes; // bs: TArray<Byte> begin bs := VarArrayOf([11, 22, 256]); ShowMessage(IntToStr(bs[2])); //0 bs := VarArrayOf([11, 22, 257]); ShowMessage(IntToStr(bs[2])); //1 end;
那么此時表示256需要兩個Byte,111111111 00000000
問題來了,如果說是負數呢,-255和255,前人把字節前面用0或1表示有無符號,0為負數,1為正數。
進制是怎么回事呢:
二進制前面講啦,就是所有0和1的組合,滿1進1,N進制就是滿N進1,一般用十六進制表示字節,再拿255作為例子:
255: 1111 1111 F F // 是不是剛剛好每四位二進制(4個bit)占一位十六進制數?
一個十六進制字符剛好可以表示一個byte的4個字節,可以明顯顯而易懂,所以說一般串口通訊,UDP通訊都會轉成十六進制與硬件交互。
delphi中主要用到十六進制,其它進制原理都有一樣,這里略過。
前面說了bit(字),Byte(字節),TBytes(字節數組)和進制,接下來說下Char,String是怎么回事:
有了TBytes的表示仍然不夠用,TBytes表示的是數字類型,無法表示字符類型,例如漢字,字母等TBytes都將其轉成了Byte,表達的不完善,所有就需要用Char表示一個字母,或者一個漢字,char表示字符類型。
var cha:char; i: integer; begin cha:='A' ; b1 := byte(cha); ShowMessage(b1.ToString); // 65 i := Byte(cha); ShowMessage(i.ToString); // 65 這里TByte直接將字符A轉成了AscII值 cha:=chr(byte(cha)+32); // A 原型 ShowMessage(cha); end;
其它的漢字等都是編碼問題:
在Ansi字符中,一個漢字占一個字節,而Unicode一個漢字需要占用兩個字節。這就形成了好多中文亂碼問題,這也沒辦法,都是規定,需要轉成統一的編碼字符。
N個Char的數組即為string,delphi處理字符串的方法是以內存的第一位記錄字符串的長度,所以s[I]的下標從1開始而非從0開始,
而c表示字符串是用0表示字符串結束,那如果字符串中間有0呢?當然他們自己有自己的一套算法機制,
其實所有的都是人類規定的,電腦只存在0和1。