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

对bit、byte、TByte、Char、string、进制的认识的更多相关文章

  1. java byte数组与16进制间的相互转换

      java byte数组与16进制间的相互转换 CreationTime--2018年6月11日15点34分 Author:Marydon 1.准备工作 import java.util.Array ...

  2. Java中byte与(16进制)字符串的互相转换

    java中byte用二进制表示占用8位,而我们知道16进制的每个字符需要用4位二进制位来表示,所以我们就可以把每个byte转换成两个相应的16进制字符,即把byte的高4位和低4位分别转换成相应的16 ...

  3. C# byte数组与16进制间的相互转换

      1.byte数组转16进制字符串 /// <summary> /// 将一个byte数组转换成16进制字符串 /// </summary> /// <param na ...

  4. BYTE数组与16进制字符串互转

    //字节数组转换为HEX 字符串const string Byte2HexString(const unsigned char* input, const int datasize) { ]; ; j ...

  5. 加密算法使用(二):使用MD5加密字符串(另:byte数组转16进制自动补零方法写法)

    public static void main(String args[]) throws NoSuchAlgorithmException { String s = new String(" ...

  6. 字节数组(byte[])与16进制字符串转换

    /// <summary> /// 转换扩展类 /// </summary> public static class ConvertExtend { /// <summa ...

  7. byte数组转16进制 输出到文件

    try { File file = new File(Environment.getExternalStorageDirectory(),"shuju2"); if(!file.e ...

  8. Codeforces - 1117E - Crisp String - 进制 - 交互

    https://codeforces.com/problemset/problem/1117/E 就用abc表示数字来给每个数编码,编完直接问出移动的结果,反构造就行了,比C和D还简单. #inclu ...

  9. Java中byte与16进制字符串的互相转换

    * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串. * @param s ...

  10. JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)

    主函数类MainDemo.java package com.itcast.test20140109; import java.util.ArrayList; import java.util.Coll ...

随机推荐

  1. Mac OS X的空间去哪儿了

    记得有事儿没事儿看下,/cores/目录的大小. cores目录是存放程序dump的数据,对于绝大部分人时是没有用的.可以删除.如果遇到坑爹的程序,一直生成dump文件,硬盘瞬间就爆满了. 典型:An ...

  2. ubuntu pip 安装django报错解决

    系统版本 ubuntu  Kylin 16.04 LTS       安装pip3 安装 Django 总是提示time out,无法安装. 逛了好多论坛终于遭到了解决办法,分享保存: sudo pi ...

  3. C#对于文件操作

    //C#追加文件 StreamWriter sw = File.AppendText(Server.MapPath(".")+"\\myText.txt"); ...

  4. java的Map及Map.Entry解析

    Map<K,V>是以键-值对存储的(key-value), 而Entry<K,V>是Map中的一个接口,Map.Entry<K,V>接口主要用于获取.比较 key和 ...

  5. codeforces 742E (二分图着色)

    E. Arpa's overnight party and Mehrdad's silent entering Note that girls in Arpa's land are really at ...

  6. JavaScript导出excel文件实现

    function getXlsFromTbl(inTblId, inWindow, fname) { try { var allStr = ""; var curStr = &qu ...

  7. console.log()与alert()的区别

    1.alert() a.有阻塞作用,不点击确定,后续代码无法继续执行 b.alert只能输出string,如果alert输出的是对象,会自动调用toString()方法 eg:alert([1,2,3 ...

  8. oracle win7下 卸载

    1 右击“计算机”-->管理-->服务和应用程序-->服务,停掉所有Oracle相关的服务(以Oracle打头的,比如OracleDBConsoleorcl). 2 开始--> ...

  9. Linux系统下的Nginx安装

    nginx可以使用各平台的默认包来安装,本文是介绍使用源码编译安装,包括具体的编译参数信息. 正式开始前,编译环境gcc g++ 开发库之类的需要提前装好,这里默认你已经装好. ububtu平台编译环 ...

  10. Parallel 试验

    using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Di ...