马上注册,享受更多特权
您需要 登录 才可以下载或查看,没有帐号?立即注册 ![](source/plugin/zhanmishu_wechat/template/static/img/wechat_login.png)
x
本帖最后由 107124zj 于 2019-12-23 13:26 编辑
前一段时间一直疑惑,为何bool型变量内存占有8个位。通过社区同事解答,加查资料,加实际测试。得出:bool型变量占有8个位,但是使用的只有第一位,其余七位均为零。先贴一张地址规则表:
内存编址
从上表中,我们可看出,QX是按BIT寻址的,QB是按byte寻址的。依据BOOL型变量占有8个位,是否意味着,如果定义QX1000.0为BOOL型变量,它会占据QX1000.0 - QX1000.7这八个位呢?如果我们定义QB1000为BOOL型,它会不会占据QX1000.0-QX1000.7这八个位呢?让我们接着贴图:
定义变量
贴图三连击。首先定义测试要用的变量,其次,置位QX1000.0,我们发现并没有出现QX1000.0-QX1000.7都变成true的情况,只有QX1000.0变为true,说明定义QX1000.0为BOOL型变量,并不会占据QX1000.0-QX1000.7这八个位。且发现运行时,QX1000.0的变量类型并不是BOOL型,而是BIT型。 那么我们再看,我们定义QB1000为BOOL型,它会不会占据QX1000.0-QX1000.7这八个位呢?显然是会,置位QX1000.1时,QB1000显示不能得到表达式的值,当然不能了,如果QB1000定义为byte型,此时的值应该是2,但BOOL型变量只有0和1两个值。 总结一下:定义QB1000为BOOL型,会占据8个位,但只使用第一位;定义QX1000.0为BOOL型变量,不会影响后续的QX,只会占一位。是否意味着,因为QX是按BIT寻址的,所以定义的变量内存不会超过bit。那么对于QB来说,是否存在定义变量内存不超过BYTE的情况。继续贴图:
运行时,QB1000-QB1002都显示为word型,即对QB来说,存在定义变量内存超过BYTE的情况。变量内存超程会借位,即QB1000定义为word,它会把QB1001也借过来用。只要数值大小不超过word即可。如果我们把QB1000定义为INT型呢,理论上是一样的,只是需要考虑到INT型在内存中是以补码的形式储存的。这个和C语言是一样的。我们经常会用到REAL型变量,一般都是一个MD来表示一个REAL型变量,今天我们试试用一个QB来定义一个REAL型变量,看看会产生什么情况。继续使用贴图大法 : 定义QB1000-QB1003为REAL型,并赋值QB1000=10.75,运行,产生结果“¥#@&……“,这是什么?表示完全看不懂。之前说过借位,出现这样的结果,肯定是借位混乱导致的,那么把QB1001-QB1003定义为byte型吧,这样看起来就好多了。虽然依旧不明白。从小老师告诉我们,不明白的事要多百度。我们知道REAL型变量,32位实数。对应C语言其实就是浮点数,float。我们看看float的储存方式:
符号位就先不管了,指数部分,尾数部分这个需要好好说道说道,太长时间没碰C语言了。如果觉得我说的不清楚,可以自行百度一下。指数部分:用于存储科学计数法中的指数部分,并且采用移位存储方式。尾数部分:用于储存尾数部分。 由于计算机只认二进制0和1,对于10.75,其中10的二进制表示为1010 ,0.75的二进制表示为0.11(关于小数的二进制附上地址一份https://wenda.so.com/q/1381580944062517)。则10.75表示成二进制是1010.11,将其表示成二进制的科学计数方式:1.01011*2^3。 在计算机中,任何一个数都可以表示成1.xxxxxx*2^n 这样的形式,其中xxxxx就表示尾数部分,n表示指数部分。对于float类型,他的指数部分有8bit,可以表示-127~128,但是这里采用了移位存储的方式(他的最后一位30,是本byte的倒数第二位,他的第一位23,是上个byte的最后一位),在存储指数时数据的基数是127,而不是0。对于10.75,他的指数位就是:3+127=130,表示成二进制是:1000 0010;他的尾数为是01011。第31位是符号位,10.75是正数,故第31位是false,从第30位开始,依次是1000 010 0101 1000 0000 0000 0000 000。最后贴一张图:
从上图也能看出来,为什么把QB1001-QB1003定义为byte型时,QB1003=65,QB1002=44。在定义QB1000-QB1003为REAL型时,由于都按float型储存方式储存,出现互相干扰。
|