對bit、byte、TByte、Char、string、進制的認識


在學校老師就教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。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM