在学校老师就教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. maxiang.io css

    /**设置你自己的CSS.例如:h1 { border-bottom: 1px solid #ccc; line-height:1.6;}body { background:#FDFFD0} **/p ...

  2. System.StackOverflowException的一个例子(转)

    今天按着书上的例子写呀写,写了一下午终于做出了一个三层模式的通讯录(当然很简单),但是,弄了最后却碰到个运行时的 异常,弄得我这个asp.net菜鸟郁闷了再郁闷.异常如下:发生类型为 System.S ...

  3. SpringMVC框架搭建 基于注解

    本文将以一个很简单的案例实现 Springmvc框架的基于注解搭建,一下全为个人总结 ,如有错请大家指教!!!!!!!!! 第一步:创建一个动态web工程(在创建时 记得选上自动生成 web.xml ...

  4. Java在处理大数据的时候一些小技巧

    Java在处理大数据的时候一些小技巧 发布时间:2013-05-09 00:00:00 来源:中国IT实验室 作者:佚名   关键字:Java 众所周知,java在处理数据量比较大的时候,加载到内存必 ...

  5. 通过js获得html标签的值

    js获取html元素的值并赋值 1).input文本框 <input type="text" value="时间" placeholder="姓 ...

  6. lvs + keepalived 介绍及安装

    LVS介绍 lvs 核心ipvs      Ipvs(IP Virtual Server)是整个负载均衡的基础,如果没有这个基础,故障隔离与失败切换就毫无意义了.Ipvs 具体实现是由ipvsadm ...

  7. WebAPI的初步认识(CURD)

    1.创建一个MVC项目,选择API 2.在Models层里添加Product类,IProductRepository接口,ProductRepository类 public class Product ...

  8. [MOSEK] Stupid things when using mosek

    1.2016-8-14 我希望把一个qp问题的代码从conic constraints改为无外加约束,仅适用variable bounds的线性不等式约束 于是原来的约束代码为 if (r == MS ...

  9. Java常用的7大排序算法汇总

    1.插入排序算法 插入排序的基本思想是在遍历数组的过程中,假设在序号 i 之前的元素即 [0..i-1] 都已经排好序,本趟需要找到 i 对应的元素 x 的正确位置 k ,并且在寻找这个位置 k 的过 ...

  10. ctrip

    #-*-coding:utf8-*-from lxml import etreeimport requestsimport re#编码转换import sysreload(sys)sys.setdef ...