作者:薛8前言
来源:https://ddnd.cn/2019/02/16/byte-hex-ascii/
最近在学习中涉及到计算机储存、传输数字和字符等操作 , 由于对字节、2进制、10进制、16进制、ASCII码的概念以及它们之间的关系和转换理解的不够透彻 , 导致在通讯、MD5消息摘要算法等时候出现问题 , 是因为数据转成计算机认识的01的这个环节出现问题 。由于这个问题并不是那么容易发现 , 所以我也算是花了挺多时间才解决了这个问题 , 记录下解决过程 , 顺便也当复习一下计算机组成原理 。
ASCII码
在计算机中 , 所有的数据在存储和运算时都要使用二进制数表示(因为计算机用高电平和低电平分别表示1和0) , 例如 , 像a、b、c、d这样的52个字母(包括大写)以及0、1等数字还有一些常用的符号(例如*、#、@等)在计算机中存储时也要使用二进制数来表示 , 而具体用哪些二进制数字表示哪个符号 , 当然每个人都可以约定自己的一套(这就叫编码) , 而大家如果要想互相通信而不造成混乱 , 那么大家就必须使用相同的编码规则 , 于是美国有关的标准化组织就出台了ASCII编码 , 统一规定了上述常用符号用哪些二进制数来表示 。
ASCII 码一共规定了128个字符(0000 0000-0111 1111)的编码 , 比如空格SPACE是32(二进制0010 0000) , 大写的字母A是65(二进制0100 0001 ) 。这128个符号(包括32个不能打印出来的控制符号) , 只占用了一个字节的后面7位(低7位) , 最前面的一位(高1位)统一规定为0(不要和数字的符号位搞混) 。
当然除了ASCII码 , 还有UTF-8、GBK等 。
字节
字节(Byte)普通计算机系统能读取和定位到最小信息单位 , 即我们通过计算机储存和传输数据的时候都是先把数据转成字节 。
字节即Byte , 一个字节代表8个比特(Bit) , 字节通常缩写为B , 比特通常缩写为b 。字节的大小是8Bit , 即字节的范围是0000 0000 - 1111 1111 , 对于无符号型 , 它表示的十进制范围是[0,255] , 对于有符号型 , 高一位表示符号位 , 它表示的十进制范围是[-128,127] 。
计算机若何储存数据
计算机只认识0和1(因为计算机只有高低电平两个状态) , 数据要想通过计算机储存或者传输 , 首先是要把数据转成计算机能认识的格式即01数据 。
我们举个例子 , 以储存十进制数字28和-28为例 , 首先将十进制数转成二进制 。
需要注意的是: 数字在计算机中储存的是补码 , 而字符是在计算机中储存的是字符对应的编码(不要和数字的补码搞混) 。数字
储存十进制数字28和-28为例 , 首先将十进制数转成二进制 , 高1位为0代表正数 , 为1代表负数
28(10) = 0001 1100(2)(原码)然后计算机将二进制数字进行补码运算 , 运算结果如下
-28(10) = 1001 1100(2)(原码)
28(10) = 0001 1100(2)(原码) = 0001 1100(2)(补码)然后计算机保存的就是补码 , 当要取出数据的时候 , 就将补码逆运算一下 , 即可求出原码 , 再将原码转换一下就可以得到真实的数据了 。
-28(10) = 1001 1100(2)(原码) = 1110 0100(2)(补码)
下面以JAVA语言演示这个过程 , 首先我们要清楚Java的byte、short、int、long都是有符号的(signed)
文章插图
运行输出:
28储存到计算机后为:11100我们验证一下结果 , 验证了计算机确实是以补码的方式储存数字 。这里有个小问题 , 就是我们知道int型有4个字节即32个比特 , 但是28却输出了111005个比特而已 , 是因为toBinaryString()方法把11100前面的0给忽略了 。
-28储存到计算机后为:11111111111111111111111111100100
取出储存的28 以无符号表示:28
取出储存的-28 以无符号表示:4294967268
取出的时候 , 我们以无符号的标准去处理 , 导致取出存入的-28结果是4294967268和我们存入的不一样 , 这是因为-28是负数 , 负数的补码和原码不一样 , 而用无符号处理的话就是直接将11111111111111111111111111100100转成结果了 。而为什么28用有无符号处理结果都一样是因为正数的原码和补码一样 , 这样验证了Java的数据类型都是有符号的 。
推荐阅读
- 计算机专业求职的正确姿势
- 埃及金字塔142857是什么意思 埃及金字塔142857神奇数字
- 生蚝储存方法
- 大型数字电影茶王昨日在武夷山正式开机
- 春节吃不完的食物怎么储存?专家:不能一股脑都放进冰箱
- 夏季储存食物有技巧 4招谨防“冰箱病”
- 怎么把数字变成大写金额?
- 土豆丝怎么过夜储存,土豆丝过夜发黑了能吃吗
- 春节卖甘蔗赚钱吗,甘蔗怎么储存到过年卖
- Shell 关系运算符