对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。

原文地址:https://www.cnblogs.com/studypanp/p/5010492.html