TIA博图中常见的数据类型:(以32位数据来说明)
1、双字(Dword)
数据结构:32位,取值范围0-2^32-1,无符号,无法比较大小
2、双整数(Dint)
数据结构:32位,取值范围-2^31~2^31-1,最高位为符号位(1代表负数,0代表正数)
3、浮点数(Real)
数据结构:32位
取值范围
-3.402823e+38 到 -1.175495e-38
±0.0
+1.175495e-38 到 +3.402823e+38
最高位为符号位(1代表负数,0代表正数),接着后八位为指数位,剩下的全部为尾数为
估计有人看到这个就有点懵了,为什么浮点数的取值范围会这么奇怪?
说实话,第一次看到官方给出的数据也是有点懵逼的,后来查阅的资料,才知道大概是怎么回事,或者你也可以去看看C++上的解释是怎么说的。
我们来举个例子:
假如有一个数值:10.25(十进制),如果换算成科学计数法的算法来的话,那么就是1.025×10^1
将上面的数值换算成二进制来看的话就是1010.01,换算成科学计数法的话就是1.01001×2^3
所以,任意一个实数,我们都可以将其换算成二进制的科学计数法的格式:a×2^b
那么a的取值范围肯定是在[1,2)的范围内,也就是1.xxxx:1是整数部分,而xxxx就是尾数部分(只取前面的23位);而指数部分b:占8位(也是上图给处的范围)。
所以,用二进制的表示方法可以写为a×2^b——>(1+n)×2^e
只看n,那么n的取值范围是0~0.1111111111111111111111(23个1,这是假设换成二进制全部取最大值)
那么换算成十进制之后就变成[0,1-2^-23](至于怎么得到的1-2^-23这个数值:就是二进制的小数转换成十进制数的算法:0.11111111111111111111111:2^-1+2^-2+…+2^-22=1-2^-23(可以利用错位相减法的方法去验证))所以再加上整数1的话,那么a的取值范围就是[1,2-2^-23]
接下来我们看b的取值,这里的指数位有8个,用二进制换算的话就是2^8=225
去掉头和尾,而且这个浮点数是一个符号位,所以取值范围就是[-126,127]。所以后面的指数部分就是2^b=>[2^-126,2^127]
合起来:
绝对值最小值1.0×2^-126≈1.175e^-38
绝对值最大值(2-2^-23)*2^127≈3.4e^38
去掉绝对值之后,那么浮点数的取值范围就是
-3.402823e+38 到 -1.175495e-38
±0.0
+1.175495e-38 到 +3.402823e+38
4、定时器(TIME)
数据结构:32位
取值范围
T#-24d_20h_31m_23s_648ms 到 T#+24d_20h_31m_23s_647ms
有符号的32位定时器的取值范围换算成T#表示法,我们可以先将毫秒数转换成天数,然后再将剩余的毫秒数分别转换成小时、分钟、秒和毫秒。具体的换算方法如下:
2^31=2,147,483,648
- 将2,147,483,648 ms 除以 86,400,000(一天有86,400,000毫秒),得到24.855…天
- 将0.855..× 86,400,000,得到73883648 ms,这是剩余的毫秒数。
- 将73883648 ms 除以 3,600,000(一小时有3,600,000毫秒),得到20.5232…小时。
- 将0.5232… ×3,600,000,得到1883648ms,这是剩余的毫秒数。
- 将1883648ms 除以 60,000(一分钟有60,000毫秒),得到31.39413…分钟。
- 将0.39413… ms × 60,得到23.648ms,得到的数值就是23秒648毫秒。
所以最终结构就是24天20小时31分钟23秒648毫秒
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |