一、数据的基本单位(位、字节、字符、字、字长)
1、位 (Bit)
位(Bit)是计算机科学中的一个基本概念,全称为binary digit,即二进制位,是数据信息处理、传输、存储的最小单位。一个二进制信息数据包含多个bit位,每个bit位非0即1。
比如:在字长为8位的计算机中,2的机器数表示为:0000 0010。
2、字节 (Byte)
所谓的字节 Byte,是由八个位组成的一个单元,也就是8个bit组成1个Byte。字节(byte)是计算机存储和数据处理的基本单位之一。字节被广泛用于计算机的数据存储和文件大小度量,文件、硬盘容量等通常以字节(B)、千字节(KB)、兆字节(MB)等为单位。常见的转换关系为:
1 byte (字节)= 8 bit (位);
1 B = 1 byte (字节);
1 KB = 1024 B(字节);
1 MB = 1024 KB;
1 GB = 1024 MB;
1 TB = 1024 GB;
3、字符 (character)
字符是数据结构中最小的数据存取单位,包括字母、数字、符号以及汉字、空格等。在计算机科学中,字符也叫字,通常是指能被计算机识别和处理的单个单位。
字符也是计算机中经常用到的二进制编码形式,通常通过特定的编码规则将字符映射到相应的数值上,以便在计算机中存储和传输。
字符、字符串和字符编码的区别:
字符:是一个信息单位,可以是中文汉字、英文字母、阿拉伯数字等。在计算机中,一个汉字、一个英文字母或数字都是一个字符。
字符串:是由数字、字母、下划线等组成的一串字符。
字符编码:是将字符集中的字符编码为特定的二进制数,以便在计算机中存储。常见的编码方式有UTF-8、GBK等。
常见的编码字符与字节的对应关系如下:
① ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。最小值0,最大值255。
② UTF-8编码中,一个英文字符占用1个字节,一个中文(含繁体)字符占用3个字节。
③ Unicode编码中,一个英文字符占用2个字节,一个中文(含繁体)字符占用2个字节。
符号:英文标点占用1个字节,中文标点占两个字节。
举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
④ GBK编码方式是中文字符占2个字节,英文字符占1个字节。
4、字(Word)
字(word)是指计算机处理器(CPU)在一个操作中能够同时处理的最大数据单位,一个字是作为一个整体来处理或运算的一串数码。它是计算机用来一次性处理事务的一个固定长度的位(bit)组。它的大小根据计算机架构的不同而有所不同。
一个字的长度(即包含的位数)取决于具体的计算机系统或处理器架构。在不同的上下文中,字的长度可能有所不同,常见的有以下几种情况:
8位字:在某些嵌入式系统或特定应用中,一个字可能被定义为8位(即1个字节)。
16位字:早期的个人计算机和一些微控制器中,一个字通常是16位。
32位字:现代计算机系统中,特别是在32位处理器上,一个字通常被定义为32位。
64位字:在64位处理器和操作系统中,一个字可以是64位,尽管在实际编程中,64位数据通常被称为双字(Doubleword)或更常见的是直接用“64位”来描述。
需要注意的是,上述定义并不是绝对的,因为不同的系统和编程语言可能有自己的约定。
5、字长(Word Length)
字长通常是指计算机处理器(CPU)在一个操作中能够同时处理的最大二进制数据位数。也称为处理器的位宽。它决定了计算机内部数据通路的宽度,从而影响了计算机的运算能力和性能。具体来说,字长越长,处理器能够在一次操作中处理的数据就越多,这通常意味着更高的运算速度和更大的数据处理能力。
字长是描述处理器性能的参数,根据计算机架构的不同而有所不同。
8位处理器:一次只能处理8位数据。
16位处理器:一次能处理16位数据。
32位处理器:一次能处理32位数据。
64位处理器:一次能处理64位数据。
6、字和字长的关系
在许多情况下,一个字的长度与处理器的字长相匹配。也就是说,如果处理器是32位的,那么在该系统上运行的大多数程序中,一个字通常也是32位的。但这并不是绝对的,因为软件可以设计为使用比处理器字长更长或更短的数据类型。
字是一个数据存储和处理的基本单位,而字长则是描述处理器性能的参数。字长直接影响计算机的运算速度和数据处理能力,而字的长度更多地影响程序设计和内存管理。
二、机器数(原码、反码、补码)、真值
1、机器数
一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。
比如,十进制中的数 +3 ,在字长为8位的计算机中,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。
机器数有三种表示形式,分别是:原码、反码、补码。
2、真值
带符号位的机器数对应的真正数值叫做机器数的真值。
因为机器数第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,提出了真值的概念。
真值通常用二进制表示,也可以用其它进制表示。
例:0000 0101的真值 = +000 0101 = +5,1000 0101的真值 = –000 0101 = –5。
3、原码
将依据字长表示的二进制数真值中的正符号用0表示,负数符号用1表示,叫做机器数的原码形式,简称原码。
例如在字长为8位的计算机中:
+2的真值为 +000 0010,原码为 0000 0010
-2的真值为 - 000 0010,原码为 1000 0010
4、反码
正数的反码就是其原码,负数的反码则是符号位不变,其他位按位取反(0变1,1变0)。
例如在字长为8位的计算机中:
+2的真值为 +000 0010,原码为 0000 0010,反码为 0000 0010
-2的真值为 - 000 0010,原码为 1000 0010,反码为 1111 1101
5、补码
正数的补码就是其原码,负数的补码则是反码+1。
例如在字长为8位的计算机中:
+2的真值为 +000 0010,原码为 0000 0010,反码为 0000 0010,补码为 0000 0010。
-2的真值为 -000 0010,原码为 1000 0010,反码为 1111 1101,补码为 1111 1110。
备注:
计算机所有的存储和计算都是通过补码的形式实现的。
正数的原码和补码相同。
负数的原码转换为补码:符号位不变,原码数值位按位取反+1。
负数的补码转换为原码:符号位不变,补码数值位按位取反+1。
2的n次幂的二进制形式:第n+1位是1(从右往左数),其余位为0。
2的n次幂的二进制形式按位取反:第n+1位是0(从右往左数),其余位全部为1。
三、关于十六进制表示法
虽然计算机内部使用二进制数字系统来进行计算和存储数据,但在计算机编程和数据表示的实际应用中,人们通常使用十六进制来代替二进制进行书写和表示。这是因为十六进制具有许多优点,使得它比二进制更加方便和实用。
1、简化数据表示
十六进制可以将一个字节(即 8 个二进制位)表示为两个十六进制数,这大大简化了数据表示的复杂性。例如,二进制数 11010101 可以用十六进制数 D5 来表示。
4位二进制可转化为1位十六进制,多位二进制数据可以每四位合并为一位十六进制。
例如:二进制1111111111111111转换为十六进制为FFFF(或ffff),通常表示为0xFFFF(0x前缀是十六进制标记)。
2、可读性更高,易于识别和记忆
相对于二进制,十六进制的数字更加紧凑,使得人们更容易记住和识别。例如,颜色值通常使用六位的十六进制数来表示,而这六位数字表示为二进制则需要 24 个位,很难记忆和书写。
3、能够更好地与计算机系统进行交互
许多计算机应用程序和操作系统都使用十六进制表示数据和指令,因此使用十六进制能够更好地与计算机系统进行交互。例如,程序员经常使用十六进制来指定内存地址、颜色值、日期和时间戳等。在操作系统中,十六进制时间戳可以表示日期和时间,而十六进制内存地址可以指定计算机中的特定存储位置。
4、可以用于处理较大的数据量
例如,在加密和网络传输中,十六进制可以用于表示大的数字和密钥,这些数字和密钥可能包含数百或数千位。使用十六进制可以使这些数字更易于存储和处理,同时保证数据的安全性和完整性。
四、Int类型和Long类型数据的进制转换
Int类型和Long类型数据不涉及小数,进制转换相对简单。
1、各进制数据字符串的特点
进制 | Int类型 | Long类型 | ||||||
正数 | 负数 | 正数 | 负数 | |||||
字符串 长度 | 最高位 数据范围 | 字符串 长度 | 最高位 数据范围 | 字符串 长度 | 最高位 数据范围 | 字符串 长度 | 最高位 数据范围 | |
二进制 | 1-31 | 1 | 32 | 1 | 1-63 | 1 | 64 | 1 |
四进制 | 1-16 | 1 | 16 | 2、3 | 1-32 | 1 | 32 | 2、3 |
八进制 | 1-11 | 1 | 11 | 2、3 | 1-22 | 1 | 22 | 2、3 |
十进制 | 1-10 | 1-9 | 11 | 负号 | 1-19 | 1-9 | 20 | 负号 |
十六进制 | 1-8 | 1-7 | 8 | 8-F | 1-16 | 1-7 | 16 | 8-F |
2、B4X中的进制转换函数
(1) 十进制转二进制
Bit.ToBinaryString:只能转换Int类型数值,返回二进制字符串。
(2)十进制转八进制
Bit.ToOctalString:只能转换Int类型数值,返回八进制字符串。
(3)十进制转十六进制
Bit.ToHexString:只能转换Int类型数值,返回十六进制字符串。
Bit.ToHexStringLong:转换Long类型数值,返回十六进制字符串。
(4)将其它进制字符串转换为十进制Int类型数值
Bit.ParseInt(Value as String,Radix as Int) As Int
Value为Radix进制的合法字符串,如果要转换为负数,字符串前面需加负号。
Value按规则解析返回的数值必须在Int取值范围内,否则会产生错误。
Radix的取值范围为:2(包含) - 36(包含)。
(5)将其它进制字符串转换为十进制Long类型数值
Bit.ParseLong(Value as String,Radix as Int) As Long
Value为Radix进制的合法字符串,如果要转换为负数,字符串前面需加负号。
Value按规则解析返回的数值必须在Long取值范围内,否则会产生错误。
Radix的取值范围为:2(包含) - 36(包含)。
3、B4X中的进制标识
前缀0表示8进制,前缀0x或0X表示16进制。加了标识符后输出的是十进制。
比如:
Dim a As Int=0225 '八进制225
Log(a) '输出:149 (十进制)
Dim b As Int=0Xfffffd89 '十六进制fffffd89
Log(b) '输出:-631 (十进制)
五、Float和Double类型数值的进制转换
1、进位计数制
按进位的方法进行计数,称为进位计数制。二进制、八进制、十进制、十六进制均属于进位计数制。进位计数制包含一组数码符号和三个基本因素:
① 数码
数码是一组用来表示某种数制的符号。
二进制的数码是0、1 ;
八进制的数码是0、1、2、3、4、5、6、7;
十进制的数码是0、1、2、3、4、5、6、7、8、9;
十六进制的数码是0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F。
② 基数(R):
基数是某种数制可以使用的数码个数。
二进制的基数是2,八进制的基数是8;十进制的基数是10; 十六进制的基数是16。
③ 数位(i):
数位是数码在一个数中所处的位置,以小数点为中心,小数点左边位数,从右向左依次从0开始,小数点右边位数从左向右依次从-1开始。
例如十进制数543.21的每个数字所在位数分别为:2、1、0、-1、-2。
④ 权(Ri):
权是基数(R)的数位(i)次方,表示数码在不同位置上的数值。
例如:十进制数值543.21 各位数的权分别为:10²、10¹、10⁰、10⁻¹、10⁻²。
加权计算各位项的合计值就得到该数的结果值。
5 × 10² + 4 × 10¹ + 1 × 10⁰ + 2 × 10⁻¹ + 1 × 10⁻² = 543.21。
2、二进制转八进制
转换规则:以小数点为中心,整数部分从右向左,小数部分从左向右,"三位一体",不足补0。
"三位一体"即整数部分和小数部分均按三位一组分组,不足位的整数部分在左边补0,小数部分在右边补0。每3位代表一个值(每3位从右向左位次为0,1,2),由这些值组成八进制数。
例如:10101010.11110
分组为:010 101 010 . 111 100 (红色的0为补位的0)
分组值: 2 5 2 . 7 4
结果为:252.74
3、二进制转十进制
·转换规则:二进制各位上的系数乘以对应的权,然后求其和。
例如:二进制111.11转为十进制数,结果为7.75。
1×2²+1×2¹+1×2⁰+1×2⁻¹+1×2⁻² =7.75
4、二进制转十六进制
转换规则:以小数点为中心,整数部分从右向左,小数部分从左向右,"四位一体",不足补0。
"四位一体"即整数部分和小数部分均按四位一组分组,整数部分不足位在左边补0,小数部分不足位在右边补0。每4位代表一个值(每4位从右向左位次为0,1,2,3),由这些值组成八进制数。
例如:二进制数111010101.111
分组为:0001 1101 0101 . 1110 (红色的0为补位的0)
分组值: 1 D 5 . E
结果为:1D5.E
5、八进制转二进制
转换规则与二进制转八进制正好相反,把八进制上的每一位数转为三位的二进制数,再合起来就是二进制数。
例如:324.56 转为 二进制为 011 010 100 . 101 110,结果为11010100.10111。
6、八进制转十进制
转换规则:八进制各位数上的系数*权,再求和。
例如:123.13 转为十进制就是 83.171875
1×8²+2×8¹+3×8⁰+1×8⁻¹+3×8⁻²=64+16+3+0.125+0.046875=83.171875
7、八进制转十六进制
转换规则1:先把八进制转成十进制,再把十进制转成十六进制。
转换规则2:先把八进制转成二进制,再把二进制转成十六进制。
例如:八进制数324.56 ,先转成二进制为 011 010 111.101 110,再按4位一体规则分隔为1101 0111. 1011 1000,换算为16进制,结果就是 D7.B8。
8、十进制转成 n (n=2,8,16)进制数
转换规则:整数部分除以 n 取余数,倒着写。
小数部分乘以 n 取整数,顺着写。小数部分一般保留三位,末位四舍五入。
例如:十进制数18.55 转十六进制数,结果为:12.8CC
9、十六进制转二进制
转换规则:把十六进制每一位数转换为4位二进制,合并得到二进制数。
例如:十六进制 F65.CD 转为 二进制为 1111 0110 0101.1100 1101
10、十六进制转八进制
转换规则:先从十六转十进制,再转为八进制,或者,十六转为二进制,再转为八进制
11、十六进制转十进制
转换规则:让十六进制上的各位系数乘以对应的权,然后求和即为十进制数值。
例如:十六进制的 D8F.C3 转为 十进制 就是 303.75
13×16²2+8×16¹+15×16⁰+12×16⁻¹+3×16⁻²=3328+128+15+0.75+0.012=3471.762
六、浮点数的机器码
浮点数分为单精度浮点数(Float,32位)和双精度浮点数(Double,64位),浮点数在计算机和数字设备上的存储和运算使用特殊的机器码,是根据国际标准IEEE 754定义的二进制码。任意一个二进制浮点数V可以表示成下面的形式:
V = (-1)s * M * 2E
(-1)s 表示符号位,当s=0时,V为正数;当s=1时,V为负数。
M表示有效数字,大于等于1,小于2。
2E 表示指数位。(其中2也可以换成别的基),E是小数点左移的位数。
例如:十进制的-7.5,写成二进制是-111.1,相当于-1.111×22 (科学计数法)。此时,s=1,M=1.111,E=2。
IEEE 754规定,对于32位的浮点数,最高的1位是符号位s,接着的8位是指数E,剩下的23位为有效数字M。
对于64位的浮点数,最高的1位是符号位S,接着的11位是指数E,剩下的52位为有效数字M。
IEEE 754对有效数字M和指数E,还有一些特别规定。
关于M:
前面说过,1≤M<2,也就是说,M可以写成1.xxxxxx的形式,其中xxxxxx表示小数部分。IEEE 754规定,在计算机 内部保存M时,默认这个数的第一位总是1,因此可以被舍去,只保存后面的xxxxxx部分。比如保存1.01的时候,只 保存01,等到读取的时候,再把第一位的1加上去。这样做的目的,是节省1位有效数字。以32位浮点数为例,留给 M只有23位,将第一位的1舍去以后,等于可以保存24位有效数字。
关于指数E:
首先,E为一个无符号整数(unsigned int)。这意味着,如果E为8位,它的取值范围为0~255;如果E为11位,它 的取值范围为0~2047。但是,我们知道,科学计数法中的E是可以出现负数的,所以IEEE 754规定,E的真实值必须 由E再减去一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。
比如,210 的E是10,所以保存成32位浮点数时,必须保存成10(E的真实值)+127=137(E),即10001001。
指数E还有以下三种情况:
(1)E不全为0或不全为1。这时,浮点数就采用上面的规则表示,即指数E的计算值减去127(或1023),得到真实值,再将有效数字M前加上第一位的1。
(2)E全为0。这时,浮点数的指数E等于1-127(或者1-1023),有效数字M不再加上第一位的1,而是还原为 0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字。
(3)E全为1。这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s);如果有效数字M不全为0,表示 这个数不是一个数(NaN)。