开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

12
返回列表 发新帖
楼主: 不得不爱2
收起左侧

[图文资料] 易语言变量详解-第三课:深入整数变量

[复制链接]
 楼主| 发表于 2014-6-19 22:14:57 | 显示全部楼层   四川省南充市
沐紫萌 发表于 2014-6-19 22:14
这个死循环有什么意义呢

这不是死循环啊,仔细看啊
回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 10 天

发表于 2014-6-19 22:14:12 | 显示全部楼层   四川省成都市
这个死循环有什么意义呢
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 22:11:38 | 显示全部楼层   四川省南充市

什么 0 0?
你说的是什么
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 22:08:34 | 显示全部楼层   四川省南充市
接下来我们换个难度更高的,转换成有符号的整数。
负数在内存中是用补码的形式存储的,补码的规则就是用0减去(剩余31位二进制取反后+1)的数值。对于这方面感兴趣具体请自行百度搜索:补码
我们可以这样写
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
调试输出 (四字节到有符号整数 ({ 255, 255, 255, 255 }))
子程序名返回值类型公开备 注
四字节到有符号整数整数型 
参数名类 型参考可空数组备 注
字节集字节集字节集长度为4
变量名类 型静态数组备 注
临时文本文本型 
循环次数整数型 
如果真 (取字节集长度 (字节集) ≠ 4)
返回 (0)  ' 错误
计次循环首 (4, 循环次数)
临时文本 = 进制_字节到二进制 (字节集 [循环次数]) + 临时文本  ' 高位在前低位在后
计次循环尾 ()
返回 (进制_二进制到长整数型 (临时文本))


i支持库列表   支持库注释   
spec特殊功能支持库


开始运行被调试程序
* -1
被调试易程序运行完毕




讲到这里如果大家是认真看的并且跟着一起练习的话我想应该已经了解了易语言中整数变量的存储方式了吧=w=

易语言的三种变量,短整数,整数,长整数的占用字节数分别是2,4,8.
他们都是有符号的,易语言中似乎没有无符号整数变量。
取值范围分别是
短整数 -32,768 到 32,767
整数 -2,147,483,648 到 2,147,483,647
长整数 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807

至于他们在内存中的存储方法都一样,区别只是长度不同


第三课到此结束...第四课可能会详细讲解小数或者文本变量吧..

然后是数组,自定义数据类型....

大概这个教程就算完结了
回复 支持 反对

使用道具 举报

结帖率:86% (6/7)

签到天数: 10 天

发表于 2014-6-19 22:05:45 | 显示全部楼层   四川省成都市
0 0什么意思
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 22:00:04 | 显示全部楼层   四川省南充市
OK,然后让我们来试试吧字节型的数据转换回整数

先从简单的无符号整数来试试吧~首先我们来研究下如何把十进制转换到二进制。

以下内容来自度娘百科:
十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2整除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为0时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。

根据百科内容我们自己写一个转换试试~
  
子程序名返回值类型公开备 注
进制_字节到二进制文本型 
参数名类 型参考可空数组备 注
字节字节型
变量名类 型静态数组备 注
返回值文本型 
' 循环除2取余,用余数逆序排列
判断循环首 ()
返回值 = 到文本 (字节 % 2) + 返回值  ' 求余并倒数排序
字节 = 字节 ÷ 2  ' 除2
如果真 (字节 = 0)  ' 如果是0就不需要继续计算了,且最后一次求余一定是0
返回值 = “0” + 返回值
跳出循环 ()
如果真 (字节 = 1)
返回值 = “1” + 返回值  ' 如果是0就不需要继续计算了,且最后一次求余一定是0
跳出循环 ()

判断循环尾 ()
如果真 (取文本长度 (返回值) ≠ 8)
返回值 = 取重复文本 (8 - 取文本长度 (返回值), “0”) + 返回值  ' 不足8位补足8位
返回 (返回值)


现在我们已经可以将字节转换成二进制了。然后我们写个二进制转换到十进制,就可以转换到整数了...
(其实对于无符号的转换不需要这么麻烦,只是为了更好的展示转换过程所以这样做了


以下转换方法摘自度娘百科:
要从右到左用二进制的每个数去乘以2的相应次方(次方要从0开始算起)
例如:二进制数1101转化成十进制
1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13

  
子程序名返回值类型公开备 注
进制_二进制到长整数型长整数型 
参数名类 型参考可空数组备 注
二进制文本文本型
变量名类 型静态数组备 注
循环次数整数型 
文本长度整数型 
长整数返回值长整数型 
文本长度 = 取文本长度 (二进制文本)
' 计算方法:倒序(从右到左)遍历,如果是1,则算1x2的循环次数-1次方
' 将遍历的所有结果相加得到转换回去的结果
计次循环首 (文本长度, 循环次数)
' 倒序遍历
如果真 (取文本中间 (二进制文本, 文本长度 - 循环次数 + 1, 1)“1”)
长整数返回值 = 长整数返回值 + 求次方 (2, 循环次数 - 1)
' 0乗任何数都是0,所以不用处理
计次循环尾 ()
返回 (长整数返回值)




OK,都准备好了,接下来写无符号的转换是很简单的了
  
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
调试输出 (四字节到无符号整数 ({ 255, 255, 255, 255 }))
子程序名返回值类型公开备 注
四字节到无符号整数长整数型 因为易语言里面的整数都是有符号的,所以必须用长整数
参数名类 型参考可空数组备 注
字节集字节集字节集长度为4
变量名类 型静态数组备 注
临时文本文本型 
循环次数整数型 
如果真 (取字节集长度 (字节集) ≠ 4)
返回 (0)  ' 错误
计次循环首 (4, 循环次数)
临时文本 = 进制_字节到二进制 (字节集 [循环次数]) + 临时文本  ' 高位在前低位在后
计次循环尾 ()
返回 (进制_二进制到长整数型 (临时文本))


i支持库列表   支持库注释   
spec特殊功能支持库


开始运行被调试程序
* 4294967295
被调试易程序运行完毕

可以看到结果是4294967295,正是我们之前说的无符号整数的最大值。所以到这里转换成功!


回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-6-19 21:13:00 | 显示全部楼层   四川省南充市
本帖最后由 不得不爱2 于 2014-6-19 22:10 编辑
  
子程序名返回值类型公开备 注
测试  
变量名类 型静态数组备 注
a整数型 
a = 0
判断循环首 (a ≥ 0)
a = a + 1
判断循环尾 ()
调试输出 (a)


i支持库列表   支持库注释   
spec特殊功能支持库

开始运行被调试程序
* -2147483648
被调试易程序运行完毕


没错,这段代码并不是一段死循环...因为易语言中的整数变量是有符号整数变量。

先来讲解下有符号和无符号吧。

易语言的整数变量在内存中占4字节长度
为了方便表达我们先讲下16进制
11111111=255=FF
以后很多地方我都会选择十六进制,两位=一个字节。如果 FF FF,就是两个字节,等同于{255,255}

Ok,已知整数占的范围是4字节,取值范围也就是 00 00 00 00~FF FF FF FF
我们像字节集那样转换成整数看看...
00 00 00 00=0
FF FF FF FF=4294967295
所以无符号整数变量的取值范围应该是0~4294967295。
不过我说的是无符号...易语言的整数型变量是有符号的....
什么是有符号呢?就是有符号-,可以表示负数的变量类型。
在易语言中,负数是这样存储的
10000000 00000000 00000000 00000000
这是一个长度为四字节的二进制数,当最前面哪位是1的时候说明是负数,反之则说明是正数。
所以易语言整数变量的取值范围是 -2147483648~2147483647
接下来为了验证想法我将多次使用进制转换,因为是直接用的模块,具体代码请见精易模块源码什么的


  
子程序名返回值类型公开备 注
测试  
变量名类 型静态数组备 注
a整数型 
调试输出 (进制_十到二 (2147483647), 取文本长度 (进制_十到二 (2147483647)))
调试输出 (进制_二到十 (“1”取重复文本 (31, “0”)))


i支持库列表   支持库注释   
spec特殊功能支持库


开始运行被调试程序
* “1111111111111111111111111111111” | 31
* -2147483648
被调试易程序运行完毕

可以看到,数据上限如果转换成二进制是31个1,也就是3×8+7个。剩下的一位1用来决定是正数还是负数。
当再次+1的时候就会导致进位,变成了1+31个0.地一位变成了1,结果为负数,模块转换后值是-2147483648,与第一幅图片里调试输出的结果相同。

这就是为什么第一个图片里的例子不是死循环的原因。

回到我们上一课的一个问题:为何字节集变量存储数据不能超过4GB。
我们来看下可以存储的最大字节数,整数变量(假设是无符号的)最大值是4294967295
4294967295字节=4194304KB=4096MB=4GB
PS:上面计算的是四舍五入的结果,真实结果是3.999999999068677...GB

回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表