zoukankan      html  css  js  c++  java
  • 对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。

  • 相关阅读:
    path.join()和path.resolve()的区别
    防抖debounce和节流throttle
    Promise原理剖析
    从页面到服务器,node实现文件下载
    从toString()方法到Object.prototype.toString.call()方法
    一个url加载的全过程
    vue2.0中配置文件路径
    vue2.0 #$emit,$on的使用
    跨平台移动应用引擎CrossApp V0.6.0 发布,增加视频控件
    天使汇&9秒闪投手游专场-寻找下一个《刀塔传奇》
  • 原文地址:https://www.cnblogs.com/studypanp/p/5010492.html
Copyright © 2011-2022 走看看