查看: 9422|回复: 38
收起左侧

[需求建议] 关于inoproshop编程中的地址、变量、内存

邀请回答

马上注册,享受更多特权

您需要 登录 才可以下载或查看,没有帐号?立即注册   

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这八个位呢?让我们接着贴图:

定义变量

定义变量

搜狗截图20191220103135.jpg
搜狗截图20191220103215.jpg

贴图三连击。首先定义测试要用的变量,其次,置位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的情况。继续贴图:

搜狗截图20191220104029.jpg
搜狗截图20191220104655.jpg
搜狗截图20191220104752.jpg
搜狗截图20191220110028.jpg
搜狗截图20191220110138.jpg

运行时,QB1000-QB1002都显示为word型,即对QB来说,存在定义变量内存超过BYTE的情况。变量内存超程会借位,即QB1000定义为word,它会把QB1001也借过来用。只要数值大小不超过word即可。如果我们把QB1000定义为INT型呢,理论上是一样的,只是需要考虑到INT型在内存中是以补码的形式储存的。这个和C语言是一样的。我们经常会用到REAL型变量,一般都是一个MD来表示一个REAL型变量,今天我们试试用一个QB来定义一个REAL型变量,看看会产生什么情况。继续使用贴图大法

搜狗截图20191220124946.jpg
搜狗截图20191220124843.jpg

定义QB1000-QB1003为REAL型,并赋值QB1000=10.75,运行,产生结果“¥#@&……“,这是什么?表示完全看不懂。之前说过借位,出现这样的结果,肯定是借位混乱导致的,那么把QB1001-QB1003定义为byte型吧,这样看起来就好多了。虽然依旧不明白。从小老师告诉我们,不明白的事要多百度。我们知道REAL型变量,32位实数。对应C语言其实就是浮点数,float。我们看看float的储存方式:


搜狗截图20191220130041.jpg


符号位就先不管了,指数部分,尾数部分这个需要好好说道说道,太长时间没碰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。最后贴一张图:

搜狗截图20191220125437.jpg

从上图也能看出来,为什么把QB1001-QB1003定义为byte型时,QB1003=65,QB1002=44。在定义QB1000-QB1003为REAL型时,由于都按float型储存方式储存,出现互相干扰。




搜狗截图20191220110028.jpg




上一篇:请教TCP/IP、MODBUS TCP等等这些都有什么区别?
下一篇:STATISTICS_REAL

已有 0 人打赏作者

回复 邀请回答送花

使用道具 举报

刘几强 2021-3-10 15:22:20 | 显示全部楼层
虽然看不怎么懂(因为自己基础太低了) 但是讲得真细致,学习了谢谢楼主
回复 送花

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册   

本版积分规则

有技术问题,就上汇川技术社区

INOVANCE汇川技术 公众号

扫码下载掌上汇川APP

全国服务热线:8:30-17:30

4000-300124

苏州地址:江苏省苏州市吴中区越溪友翔路16号

深圳地址:深圳市龙华新区观澜街道高新技术产业园汇川技术总部大厦

Copyright © 2003-2100 汇川技术 Powered by Discuz! X3.4 ( 苏ICP备12002088号 )
快速回复 返回列表 返回顶部