本帖最后由 不得不爱2 于 2014-6-19 22:10 编辑
a = 0 判断循环首 (a ≥ 0 )a = a + 1 判断循环尾 ()调试输出 (a )
开始运行被调试程序
* -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
接下来为了验证想法我将多次使用进制转换,因为是直接用的模块,具体代码请见精易模块源码什么的
调试输出 (进制_十到二 (2147483647 ), 取文本长度 (进制_十到二 (2147483647 )) )调试输出 (进制_二到十 (“1” + 取重复文本 (31, “0”)) )
开始运行被调试程序
* “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
|