在学校老师就教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. Android之listview && adapter

    今天我们讲的也是非常重要的一个控件listview-最常用也是最难的 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView ...

  2. 轻型的ORM类Dapper

    Dapper是一个轻型的ORM类.代码就一个SqlMapper.cs文件,主要是IDbConnection的扩展方法,编译后就40K的一个很小的dll.官方站点http://code.google.c ...

  3. 嵌入式linux学习笔记1—内存管理MMU之虚拟地址到物理地址的转化

    一.内存管理基本知识 1.S3C2440最多会用到两级页表:以段的方式进行转换时只用到一级页表,以页的方式进行转换时用到两级页表.页的大小有三种:大页(64KB),小页(4KB),极小页(1KB).条 ...

  4. sap 常用表

    MM    表名 EBAN 采购申请

  5. EF 连接MySQL 数据库  保存中文数据后乱码问题

    EF 连接MySQL 数据库  保存中文数据后乱码问题 采用Code First 生成的数据库,MySQL数据库中,生成的表的编码格式为***** 发现这个问题后,全部手动改成UTF8(图是另一个表的 ...

  6. 移动端特殊css样式

    一般会用normalize.css或者reset.css重置样式 移动端特殊css样式 去除ios 按钮按下的默认高亮效果 -webkit-tap-highlight-color : none; io ...

  7. PD中将Comment 从Name复制值

    PD中将Comment 从Name复制值, 将以下语句考到,pd 工具栏下的执行脚本中执行下就OK了 Option Explicit ValidationMode = True Interactive ...

  8. 用TypeScript开发爬虫程序

    全局安装typescript: npm install -g typescript 目前版本2.0.3,这个版本不再需要使用typings命令了.但是vscode捆绑的版本是1.8的,需要一些配置工作 ...

  9. Http协议的常见参数

    Requests部分 Header 解释 示例 Accept 指定客户端能够接收的内容类型 Accept: text/plain, text/html Accept-Charset 浏览器可以接受的字 ...

  10. Winform打砖块游戏制作step by step第6节---双缓冲应用

    一 引子 为了让更多的编程初学者,轻松愉快地掌握面向对象的思考方法,对象继承和多态的妙用,故推出此系列随笔,还望大家多多支持. 二 本节内容---双缓冲应用 1.  主界面截图如下: 2.  什么是双 ...