上QQ阅读APP看书,第一时间看更新
2.1.3 数据类型与内存存储的关系
下文中未加特殊说明的,所讨论的编程语言均为VBScript。
在文本与二进制数据转换中,涉及的数据类型主要是Byte、Integer、Long和String这4种。这几种数据类型与它们的内存存储的对应关系如表2-2所示。
表2-2 数据类型与内存存储的关系
某些人可能会疑惑,以Integer为例,为什么内存存储的是“41 00”,不应该是“00 41”吗?没错,从概念上来说,应该是“00 41”。这里有一个字节顺序的问题,字节顺序主要分为Big Endian和Little Endian两种,“00 41”是Big Endian的写法,即高位字节在前、低位字节在后,而在VbScript语言中,实际内存存储使用的是Little Endian的写法。内存变量使用哪种字节顺序,是受CPU、操作系统、编程语言等多个因素影响的,属于底层实现机制,在这个问题上我们不必过于纠结。通常,按概念上的理解来处理二进制数据即可,这里是为了便于后面的AscB等函数的讲解,所以才写成了Little Endian的形式。
从表22可以看出,字符“A”的内存存储与Integer型的65是一致的,其实,65就是字符“A”的编码数字。在一些语言中,字符是可以当作数字来参与计算的,因为字符的实质就是数字。
如下是一段C语言的程序。
#include<stdio.h> #include<conio.h> main() { Char ch = 'A'; ch = ch + 32; printf("%c", ch); getch(); Return 0; }
该程序在字符“A”上直接加上了32,输出结果是一个字符“a”,因为后者的编码是97。大写字母A~Z的编码范围是65~90,小写字母a~z的编码范围是97~122。只要取得字母的编码数字,然后加上或减去32,即可实现大小写字母之间的转换。
在VBScript中也可以这样做,不过不能如此直接,需要借助Asc和Chr函数进行类型转换。如下例也会输出字符“a”。
ch = "A" ch = Asc(ch) +32 response.write Chr(ch)