vb类型占多少字节(VB的整数你真的了解)(1)

整数嘛,看起来简单,背后尽是黑手

前言

经过《VB的任性,从Variant开始 》、《变量,还有这些秘密 》和《VB的天地,横看成岭侧成峰 》的铺垫,似乎可以隐隐约约地感觉,VB变量背后肯定不是平常见到的那样简单。事实上,也的确如此。那么本篇,接着说说数值类型背后的文章。

在《变量,还有这些秘密 》中讨论了变量的本质,也即:不仅分配内存,更使用内存。数值类型的变量在堆栈上分配完内存后,其作用就相当于指针了。VB中的数值类型除了Byte是无符号的,Integer,Single,Long,Double,Date,Currency都是有符号的。如果要想在VB中使用无符号数,那就必须得借助指针了。

所以,要想深入了解变量,灵活使用指针,那了解分配的内存结构是非常必要的。

一、数值类型的再分类

我们知道计算机数据的存储和使用都是基于01Bit值,这种二进制机制,是天生适合整数的。所以,在此再次提醒广大VB爱好者们,要想提高VB代码性能,能使用4字节整数就尽量使用。所以,据此将数值类型进一步划分为整形和浮点型。其实浮点型也是通过整型来表示的,只是内部的Bits是需要转换的。也可以这么说,计算机里只有整数。

另外,给大家一个思考题:VB中的数值变量,为什么是1、2、4、8字节安排,而不是3、5、7之类的?

二、整数类型们, 你们好吗?

整数类型包括Byte、Boolean、Integer、Long和Currency。其内存结构很简单,定义的是多少Bits就是多少Bits。唯一需要强调的是,最高位作为符号位,就是有符号的,不作为符号位,那就是无符号的。

1、Byte类型

Byte类型表示1个字节,这是内存地址划分的最小颗粒度。该类型是VB中唯一的无符号类型。如果按有符号来看,0-127是正数,128-255是负数。从VB的应用场景来看,负数确实没有什么意义,谁会用这么小的负数呢?但在VB的高端应用中,使用Byte类型的有符号类型,几乎是必备项。

VB有该类型的数组,理论上可支持任何结构的数据类型。

2、Boolean类型

布尔类型,占2字节,在计算机里几乎是通用的。VB中的True常量被定义为-1(所有Bit位都为1),这与通用的非零定义,有细微的差异。事实上VB使用通用意义上的定义,有助于提升VB代码的简洁和高效。但VB用户在比较表达式中,应对布尔变量的通用定义保持谨慎。

例如:”If num then”通常比”If num<>0 then”更简洁高效,但”If num=True then”就会犯致命错误。

思考, Boolean为什么使用2字节?按定义使用使用1Bit足矣。

3、Integer类型

Integer类型,占2字节,有符号。值得一提的是,该类型与VB字符串类型有直接的关系。另外Office07以前,很多设置都跟这个类型有关,最出名的恐怕要算Excel中的行数了。很多VBA的朋友研究分表技术,甚至疫情期间,英国还闹了统计数据超行溢出的笑话,其实就跟软件使用了该类型有关。

那为啥不使用4字节的Long呢?理想很丰满,现实却是,在计算机的发展过程中,很多都是走一步看一步,得过且过很多时候是常态。ANSI到Unicode,邮件里的7Bit到Base64,千年虫问题,时间戳等,比比皆是。

4、Long类型

占2字节,有符号。这是32位机里使用最普遍的类型了。指针、句柄等,很多类型都可揉到这个类型里。VB后续的高阶应用里,几乎都离不开该类型。

5、Currency类型

Currency类型很特殊,虽然表现形式上是有4位定点小数,但其存储上却是整数类型。所以,在VB里,Currency类型,其实就是LongLong类型啦。说VB没有大整数的,可以休矣。

Currency类型在使用时,需要注意以下几点:

(1)、作为数值,参与计算时,直接使用即可,4位小数是有意义的。

(2)、Currency作被除数参与除法运算时,被除数不得超过除数*10^14,否则结果会出现精度问题。大家可自行思考为什么?

(3)、Currency可直接代替FILETIME结构、LARGE_INTEGER结构,无需处理,即可在API间传递64位整数。前提是,VB不要拿Currency来参与计算,直接当二传手即可。

(4)作为64位整数,且参与计算,此时传递给系统64位整数参数时,需要处理4位定点小数。如果算术处理,会比较麻烦,但结合指针则很方便。

给大家介绍一些Currency类型骚操作。

(1)、大家都知道文件都有创建、最后更改和访问时间。很多时候,这些属性可以显示操作痕迹。有很多基于此特点的授权,比如显示文档是否为副本。如果不想被认定为副本,那么就必须将时间修改的一模一样。

当然,年月日 时分秒,肯定是不行的。因为这些时间的结构是FILETIME结构,也即64位整数,人家是精确到微秒以下的,而API只能修改到毫秒的精度。所以,这时候Currency就可站出来啦,在VB里,也只有Currency能够将文件时间进行精确还原。

(2)、利用Currency,可以设计所谓祖先代码。也就是,一串莫名其妙的数字,但可发挥巨量的作用,可以将代码的可读性降低到没朋友。任何人后期维护,都不能删除这些数字。与其删库跑路,还不如多整几段祖先代码,江湖里将始终有你的传说。

三、前篇释疑

在《VB的天地,横看成岭侧成峰 》中给大家提到,Byte、Boolean、Integer的使用性能和开销与Long一样,那为什么还需要定义1字节和2字节类型呢?这个很好理解,你想100元,下面有50、20、10、5、1面值对吧,其实是一个道理。本质上来说,其实跟后续要跟大家讲的,指针取值有关。留到大家评论区讨论吧。

<点击加关注,更多VB精彩等你来看>

,