在学校老师就教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。