易语言的基本数据类型里的数值型不区分有符号与无符号类型,所谓符号是指保存在这个变量中的数值应该是绝对正值,还是可以为负值.
在C++语言中
char (signed char) 有符号字节型 取值范围可以在 -128 到 +127 间
uchar (unsigned char) 无符号字节型 取值范围是 0 到 255 间
short (signed short) 有符号短整数型 取值范围可以在 -32768 到 +32767 间
ushort (unsigned short) 无符号短整数型 取值范围可以在 0 到 65535 间
包含还有整数型,长整数型等也都分有符号与无符号两种.
但是在易语言中只有一种,如易语言中的
字节型 为无符号型 取值范围 0 到 255间,不接受负值
短整数型 为有符号型 取值范围 -32768 到 32767 间,一旦超过这个 32767 的值就会变成负值
整数型 与 长整数型 也都为有符号型.
什么叫做符号呢?我们拿字节型来举例,字节型=1字节,1字节=8位. 8个位可以为8个0到8个1的任意组合.
0=00000000
127=01111111
255=11111111
从8个0到8个1的所有组合,刚好是十进制值的 0 到 255 间.假如我们想在这有限的8个位里存放负值呢?应该咋办?
为了区分值是正数还是负数,由于把最高位,即第8位做为符号标识位,如果第8位=0则为正数,若第8位=1则视为负数.由于便有了如下的值
-128=10000000
-127=10000001
-126=10000010
-1=11111111
0=00000000
1=00000001
126=01111110
127=01111111
可以使用系统里的 计算器 程序来转换10与2进制值,菜单-查看-科学型
对于易语言这种没有提供有无符号两种方式的情况下,会出现哪些问题呢?第一,显示问题.第二,运算问题.
先说说显示的问题吧.像下图,明明是赋值给了 -126 这个值,但由于易的字节型不支持符号型,不接受负值,结果是出来的却是+130 .这样的情况就比较让人郁闷,造成不小的困扰.

你看看,由于易语言不提供有无符号两种变型,结果明明是-值却变成了+值.正值变成了负值.
除了输出时易造成视觉困扰外,还容易影响程序代码的条件判断,流程执行.见下图的判断语句

如此显而易见的结果,应该出OK信息框的,却因为正负符号的问题而出了NO的信息框.
其中最大的问题就是短字节赋值给长字节类型时的问题.

赋值问题
由于字节型没有符号,他的值被赋值到比他更长的数据类型变量时,全部变成了正值.
也因为短整数型为符号型,原本 65500 是属于无符号短整数型 0 至 65535 范围内的值变成了负数,当赋值给更大的整数与长整数时都变成了负数值.
由于赋值的问题直接导致了两个不同数据类型间的值相加减后的运算结果,条件判断结果,显示结果等一系例的毛病.

由于两种不同类型的赋值问题从而导致运算的错误,正确值应该是-76的.
那么对于这种情况我们应该怎么办呢?我们把一切的症结归于符号问题,并由符号而间接产生两种不同类型赋值错误问题.在万挂作坊模块里提供了以下几个函数,可以辅助解决这个问题.
子程序名:取字节型 注意.用来保存返回值的变量必需大于8位的字节型数据类型才可以 返回值类型:短整数型 参数<1>的名称为“源字节型值”,类型为“字节型”。注明:易语言默认对字节型的值以无符号进行运算处理的. 参数<2>的名称为“保留符号位”,类型为“逻辑型”,允许接收空参数数据。注明:真=最高位为符号位,返回支持 负数值。
子程序名:取短整数型 注意.用来保存返回值的变量必需大于16位的短整数型数据类型才可以 返回值类型:整数型 参数<1>的名称为“源短整数值”,类型为“短整数型”。注明:易语言默认对短整数型的值以有符号进行运算处理的. 参数<2>的名称为“保留符号位”,类型为“逻辑型”,允许接收空参数数据。注明:真=最高位为符号位,返回支持 负数值。
子程序名:取整数型 注意.用来保存返回值的变量必需大于32位的整数型数据类型才可以 返回值类型:长整数型 参数<1>的名称为“源整数型值”,类型为“整数型”。注明:易语言默认对短整数型的值以有符号进行运算处理的. 参数<2>的名称为“保留符号位”,类型为“逻辑型”,允许接收空参数数据。注明:真=最高位为符号位,返回支持 负数值。
以上三个函数是把原类型赋值到比他更大的类型里去,赋值时可以决定要以符号或无符号结果.由于易语言中没有比长整数型更长的类型,所以没有提供 取长整数型() 这个功能了,对于长整数型的问题只能爱莫能助,幸好很少会用到长整数.
上面的这三个函数是在万挂作坊3.0模块中有,使用时需要引用万挂作坊模块.有关万挂作坊模块的居体用法还得见以下的其它教程文章.下面就让我们来看看这几个函数的简单用法与效果吧.

按有符号与无符号两种方式取值出来的结果

条件判断也正确了.

计算结果也正确了.
下面再提醒一下,易语言中只有 字节型 是无符号的 , 短整数型 整数型 长整数型 这三个都是有符号类型.编写代码时需要注意,你所涉及的数据会不会有正负数的情况,并可以使用模块中的以上三个功能,把这个值赋值给更长的类型变量中去.当需要两个数值进行运算时,最好把短类型的值扩展成与长类型相同类型再一起运算.
|