类型转换的规则(精选7篇)
类型转换的规则 篇1
C语言中数据类型纷杂多样,在使用中可以灵活多变,特别是在不同的场合,各种类型之间经常可以相互转换;对于这些,很多初学者觉察不出它们之间的差别,而且在进行数据类型转换时会经常出现一些问题,以至使用时经常不知所措。针对这些问题,就数据类型转换的分类以及在使用它们时应该注意的问题进行了一些深入讨论。
1 数据类型转换的方式
C语言中的数据类型转换可分为隐式转换和显式转换两种。
1.1 隐式转换
隐式转换也可称作为自动转换,它经常以以下几种形式发生:
1)在计算一个同时出现多种数据类型的表达式时,将所有数据类型都转换为同一种数据类型。
2)在对数据进行输出时,按指定格式将数据输出。
3)利用赋值运算符将数据转换为运算符左边指定的数据类型。
4)在对函数调用时,如果形参与实参的数据类型不一致,实参会自动转换为形参的数据类型。
根据转换发生的形式,可将隐式转换分为类型:一般算术转换、输出转换、赋值转换与函数调用转换。
1.1.1 一般算术转换
这种转换类型会经常出现,它是通过编译器自动实现的,不同类型的数据在一个表达式中会自动转换为最长的类型,例如:
有如下定义char a;int b,e;float c;double d;
计算a*b+c-d/e时,按计算顺序说明类型转换:
1)a*b;//char类型的a转换为int类型的值,再和int类型的b相乘。
2)d/e;//int类型的e转换为double类型的值,然后double类型的d再和e相除。
3)a*b+c;//int类型的a*b转换为float类型值,再和float类型的c相加。
4)a*b+c-d/e;//float类型的(a*b+c)转换为double类型的值,再和double类型的d/e相减。
不考虑过程,最终表达式的值为最长类型(这里是double)的值。
1.1.2 格式输出转换
这种转换类型是将某种类型的数据按照输出格式转换成指定格式。例如:
main(){int a=65;printf("%cn",a);}//输出“A”
此程序是将ASCII值为65的字符输出来,所以输出结果是“A”。
1.1.3 赋值转换
在这种转换中,会出现赋值运算符“=”,就是要将运算符右边的数据类型转换为运算符左边的数据类型,例如:
main(){int a=3.15;printf("%dn",a);}//输出结果是3
之所以会出现这种结果,就是因为运算符右边的3.15是浮点型常量,它要被转换为运算符左边的整型数据,导致整型变量被赋值为3。
1.1.4 函数调用转换
此种类型的转换主要会出现在函数调用时形参跟实参数据类型发生不一致的场合,例如:
int mul(int x,int y)//函数中的形参为int
{int a;a=x*y;return(a);}
void main()
{float a=1.23,b=2.35;
int c;c=mul(a,b);//调用函数时,由于实参是float,所以实参首先会转换为int,再执行函数体部分
printf("%d",c);}//输出结果是2
1.2 显式转换
显式转换可分为两种,即强制性数据类型转换以及利用标准函数转换。
1.2.1 强制性数据类型转换
强制性数据类型转换是将某一种数据类型强制转换为另外一种数据类型。这一种较常见。强制性数据类型转换的一般格式为:(类型标识符)表达式。例如:
main(){float a=5.6,b=2.3;printf("%dn",(int)a%(int)b);}
由于运算符“%”要求两个数据必须为int类型,如果不进行强制性数据类型转换,则系统会提示出错信息,所以浮点型数据a和b先各自转换为整型数据5和6,再进行求余运算,输出结果是1。
1.2.2 标准函数转换
这种转换是利用C语言中的标准函数将某一种数据类型转换为另外一种数据类型。例如:
main()
{int a;float b;char*c="123.45xy",*d;
b=atof(c);//将字符串c转换为float型数据
a=atoi(c);//将字符串c转换为int型数据
itoa(a,d,10);//将十进制数a转换为字符串数据并且存放在字符型指针d所指向的字符串
printf("%.4f,%d,%sn",b,a,d);//将浮点型数据b、整型数据a以及字符串数据d分别按照浮点型、十进制数整型和字符串格式输出,输出结果是:123.4500,123,123
}
2 常见问题
在对数据类型进行转换时,是为了程序的需要,可有的时候却会带来意想不到的安全隐患和错误,这就是非安全转换、输入输出格式错误与运算符数据不匹配。
2.1 非安全转换
非安全转换是将一种数据类型长的转换成其它数据类型短的数据,使其值的表示范围被缩小所出现的错误。它有如下几种情况:
2.1.1 较大整数转换为较短的类型
C语言系统一般不检测这种类型的错误,大部分的编译器在可能出现非安全转换是不会给出警告信息,因此在编程时需避免此类型转换。
如main(){long i=123456;printf("%dn",i);}//其输出结果为-6716.
又如main(){unsigned i=65535;int j;j=i;printf("%dn",j)}//输出结果为-1.
2.1.2 有符号负数转换为无符号数
例如:main(){int i=-1;printf("%u",i);}//其结果为65535
当由有符号数转换为无符号数时,原来的符号位将不作为符号,而作为数据的一部分。
2.1.3 双精度类型转换为单精度类型
例1 main()
{double i=10.123456789;float j=i;printf("%.9fn",j);
}//输出为10.123456955
例2 main()
{double i=12345678912345.123;float j=i;printf("%fn",j);
}//输出为12345679020032.000000
由于双精度类型转换成单精度类型时,可能出现以下两种情况:其一,降低精度,截断尾数,保留前8位有效数字,后面的数字无意义,如例1;其二,若数值超出了单精度所表示的范围,则得到的数据无意义,且系统不提示错误,因此在遇到较大的数据,或对数据精度要求比较高时,应避免进行此类的转换,如例2。
2.1.4 浮点数转换为整型
当浮点数转换成整型数据时,舍弃小数,不进行四舍五入,例如:
main()
{double i=15.99999;int j=i;printf("%dn",j);}//其输出为15。
因此,若需要计算结果尽可能高的精度,应避免此种类型的转换。
2.2 输入输出格式错误
这种错误会出现在格式输入与格式输出函数中。例如:
main()
{int i=2;printf("%f",i);}//会出现编译错误(数据类型不一致)
2.3 算术运算“/”、“%”与数据类型不匹配
例1 main()
{int i=7,j=2;printf("%dn",i/j);}//输出结果为3
例2 main()
{float i=12.45,j=6.3;printf("%dn",i%j);}//提示错误:非法地使用浮点数在main函数中
在例1中,程序的本来目的是想得到结果3.5,可是结果却是3,,是因为变量i和j都是int类型的,其结果也是int类型的,如果想得到3.5的话,就要将i和j都要强制转换为float类型;在例2中,之所以会出现系统提示错误,是因为运算符“%”左右两侧的数据类型都必须是int,但程序中两个变量却都不是int类型的,因此,想让系统不出错误,就必须将两个变量都强制转换为float类型。从上述两个例子来看,对于算术运算符“/”和“%”,一定要注意数据类型的匹配。
3 结论
在C语言中,多种数据类型之间的转换有它出现的必然性,也就是在某些情况下,数据转换是必须的,但应尽量避免出现将数据长的类型转换为数据短的类型、输入输出格式上的错误以及运算符数据类型不匹配等问题。
参考文献
[1]谭浩强.C程序设计[M].北京:清华大学出版社,2005:14-18.
[2]谭浩强.C++程序设计[M].北京:清华大学出版社,2004:36.
[3]谭浩强,张基温,唐永炎.C语言程序设计[M].北京:高等教育出版社,1992:87-88.
[4]Schildt H.C语言大全[M].戴健鹏,译.北京:电子工业出版社,1994:68-69.
[5]Schildt H.ANSI C标准详解[M].王曦若,李沛,译.北京:学苑出版社,1994:45-46.
[6]夏涛.C语言程序设计[M].北京:北京邮电大学出版社,2007:52-54.
[7]杨路明.C语言程序设计教程[M].北京:北京邮电大学出版社,2005:76-77.
[8]贾素玲.C语言编程[M].北京:高等教育出版社,2005:65-67.
类型转换的规则 篇2
[关键词] 限制条件;转换规则;逻辑规则;Wh-问句
[中图分类号] H314 [文献标识码] A [文章编号] 1002-2007( 2011)01-0061-06
[收稿日期] 2010-09-15
[基金项目] 国家社会科学基金项目(10XMZ042) ;延边大学“211工程”三期重点学科建 设项目(1255429082)。
[作者简介]张贞爱,女,朝鲜族,延边大学外国语学院教授,英语教育研究所所长,硕士生导师。研究 方向为英语教育,多语对比。
在形态学层面上,英语、韩语和汉语分属于三大不同类型的语言,即屈折语、粘着语和孤立 语 ,其形态特征差异明显。在句法学层面上,英语属形式语言,其形式规则经纬分明,汉语属 意义语言,韩语则兼具形、义特征。因此,韩、汉两种语言的运作机制对语言形式规则的依 存度明显低于英语。就Wh-问句本文将采用“Wh-问句”这一术语代 指英语中的特殊疑问句,韩语中的说明疑问句,汉语中的特指问句。转换生成而 言,英语在很大程度上依赖移位( α-movement)规则,而韩语和汉语则不需移位规则。Wh-问句转换生成过程中三种语言所 遵循的语言规则不尽相同。然而,在对英、韩、汉三种语言含有定语分句的复合结构本文将采用“含有定语分句的复合结构”这一本语代指英语中的定语从句,韩 语、汉语中主谓、动宾结构作定语的句子。进行对 比研究的过程中,笔者发现了英语形式规则在跨语言中产生效应的语言现实。从语言类型学 视角看,这是屈折语的形式规则在粘着语和孤立语中产生效应的语言现象。具体而言,对英 语 Wh-问句转换生成过程在形式上起作用的限制条件,对韩、汉语Wh-问句转换生成也能起到 限制及非限制作用,尤其是对含有定语分句的复合结构转换生成不合法句子起到了限制作用 。乔姆斯基所提出的转换规则限制条件(以下简称限制条件)是形式句法学的产物。问题是 ,形式句法限制条件何以对非形式语言及非典型形式语言产生效应?产生怎样的作用?本文 拟对英语限制条件在韩、汉含有定语分句的复合结构中产生效应的语言事实进行讨论,进而 解释蕴藏在其中的语言规则与语言逻辑之间的内在关系。
一、转换规则与限制条件
在乔姆斯基看来,转换生成语法操作过程中 最关键的一步是转换,即按照一定规则部分改变句子结构,使之成为另一种形状。转换运 作的 对象是已规范的句子结构,先由短语结构规则负责生成最初的句子结构,然后,转换规则负 责把生成的结构加以改造,生成同转换合在一起就是句子的主要派生过程。[1](1 1)
乔姆斯基在《转换的必要条件》(Chomsky,1977a)中指出,英语转换规则操作时的绝对有 效性和独立性以及由此产生的后果非常值得追求。既要确保转换规则的内容不必涉及句子结 构,又要保证转换的结果符合语法要求,这就要求必然建立一整套严密的转换规则限制条件 ,其作 用是控制转换规则的使用,防止生成不合法的句子。例如,为了控制英语Wh-问句转换规则 的使用,乔姆斯基及其学生(Chomsky, 1964,1977a;Ross, 1967, 1986)提出了以下限制 条件(徐烈炯,2009):[2]
(一)复杂名词词组限制(Complex Noun Phrase Constraint):
复杂名词词组中的任何成分都不能通过转换移出。
1(a) I believed s that Otto was wearing thishat
(b) *The hat which I believed the claim that Otto was wearing is red.
在1(a)中,“ the claim s that Otto was wearing this hat” 构成了一个复杂名词词 组,把其中代表this hat的关系代词which移位,则移出了复杂名词词组,就违反了复杂名 词词组限制,产生了不合法的句子。
2)主语从句限制(Sentential Subject Constraint):
如果一个从句从属于一个名词词组,而该名词词组直属于一个句子,则从句中任何 成分都不能移出。
本条限制涉及从句做主语的结构。
2(a) was expected by the re porters is an odd man.
2(b)句的不合法原因在于,其中that引导的从句从属于the teacher, 而the teacher又直属 于主句,因此,“That the principal would fire some teacher”中的任何成分都不能移 出,否则将违反主语从句限制,产生如2(b)这样不合法的句子。
(三)领属条件(Subjacency Condition)
3(b)中what越过两个S和一个S’界限,违反了领属条件,所产生的句子不合法。
二、英语限制条件在韩、汉Wh-问句转换生成中的非效应Wh-问句是疑问意义表达方式之一,与是非问句、选择问句等构成对立分布,形成疑问句类 的统一体。就信息论而言,Wh-句中被提问的部分就是该句的信息焦点。Wh-问句用来对未 知信息进行询问。Givon(1990)对特殊疑问句的讨论颇为独到,他把焦点与预设联系起来谈 论特殊疑问句的典型用法,“假设说者与听者共享某命题的部分知识(预设),说者不知道其 中一部分,所缺的这部分知识就是该问句的焦点”。在语义特征上,Wh-问句所表的疑问意 义是具体的,并具有一定的作用力,形成相应的疑问范畴。在形式结构上,具体的疑问意义 是由某一个疑问词注:本文中的疑问词在英语中指特殊疑问问,在韩语中指 疑问词,在汉语中指疑问代词。来 表示,并体现在句子某个具体的构成成分之上,即词层级上,因此,通常称为Wh-问句。注:本文中的Wh-问句在英语中指特殊疑问句,在韩语中指说明疑问句,在 汉语中指特指问句。
(一)英语限制条件在韩、汉主谓结构作宾语句子Wh-问句转换生成中的非 效应
在此,笔者分析主要论及主谓结构做宾语的句子,该主谓结构可以是谓语动词的宾语,可以 是介词 的宾语,也可以是非谓语动词的宾语;我们侧重讨论谓语动词宾语分句的Wh-问句转换 。在此,对比基础在于英语、韩语和汉语中都存在主谓结构做宾语的现象。
4(a) I expect Davidb will pass the examinationc .
(b) *Whoi do you expect .
(c) *Whati do you expect ?
5(b)-(c)是以宾语分句内的主语和宾语为疑问重心,从5(a)转换生成的Wh-问句,与4(b) -(c)句是对等的。4(b)-(c)在英语中是不合法句子,可是,5(b)-(c)在韩语中却是合法 的Wh-问句。因为,疑问词的疑问范畴在分句内没有外移。
nlc202309011648
4(b)-(c)不合法的原因在于违背了领属条件,而与之对应的韩语5(b)-(c)是合法的句子。 这说明领属条件对韩语主谓结构作宾语句子的Wh-问句转换生成不产生限制效应,因为无需 移位,也没有移位规则可言,更无法谈及移位限制条件。再来看汉语。
6(b)-(c)是以宾语分句内的主语和宾语为疑问重心,从6(a)转换生成的Wh-问句,与4(b) -(c)句是所表内容对等的句子。尽管4(b)-(c)是不合法的句子,但6(b)-(c)是合法的汉 语句子。这说明领属条件对汉语主谓结构作宾语句的Wh-问句转换生成也不产生限制效应, 因为汉语同样不涉及移位,也就没有限制移位规则的必要。
(二)英语限制条件在韩、汉含有副词性分句复合结构Wh-问句转换生成 中的非效应
在此,笔者主要讨论含有时间状语分句本文将用“含有时间状语分句的复合 结构” 这一术语通指英语的时间状语从句、韩语的从属并列句和汉语的时间复句。和地 点状语分句的复合结构。“How”和“Why”具有典型副 词特性和语法功能,但是“How”和“Why”引导的主谓结构,整体上并非具备副词性特征, 故不在此讨论。
7-9是含有时间状语分句的复合结构。“when”引导了一个主谓结构,在句中表示主句所表 事件或动作发生的时间。这是一种以事件和事件发生的先后关系来表述的时间概念,而非“ 钟点”式的明示法。以7(a)“when”从句中的主语“Mary”为疑问重心转换生成的是7(b)。 这是不合法的句子。问题出在Wh-移位。从7(a)到7(b)的转换,移位的成分不只是“when” 分句中的主语“Mary”的指代词“who”,其实还有“when”。
根据移位理论,7(b)时间状语分句中的when从原始位置移到了位置, 超越了两个界限节点,违背了领属条件,所 以7(b)不合法。
8(a)在韩语中是从属并列句,句子是由两个主谓结构构成,两者间是主从关系,即主句与分 句的从属关系。8(b)是8(a)时间分句中的主语“为疑问重心转换生成的合法句子。 9(a) 在汉语中是动词谓语句“张三唱歌的时候”做句子的时间状语,9(b)是9(a)时间状语中的 主语“张三”为疑问重心转换生成的合法句子。在韩语和汉语中,转换过程暂且不论,转换 结果与相对应句7(a)完全相背,所生成的都是合法句子。英、韩、汉含有时间状语分句的复 合结构Wh-问句转换生成过程又一次说明,英语限制条件对韩语、汉语这样的非移位语言不 产生作用。
在词层级上,“where”在英语中是副词、“在韩语中是代词、“哪里”在汉语中 是代词 ,它们在三种语言中是表示地点意义的对应表达方式,共同具有“地点”概念的指代功能。 但在句子层级上,尽管所表内容相同,表达形式却有明显差异。
三、英语限制条件在韩、汉Wh-问句转换生成中的效应从以上对比中可以看出,在主谓结构作宾语和含有副词性分句的韩、汉语句子Wh-问句转换 生成过程中,英语限制条件均不产生效应。然而,在含有定语分句的复合结构Wh-问句转换 过程中,情况却大相径庭。
(一)主语结构Wh-问句转换生成
在此讨论的重点是,由主谓、动宾结构修饰的名词短语在句子中做主语时,Wh-问 句在转换生成过程中英语转换规则限制条件产生效应情况。在此,对比基础在于英、韩、汉 三语中都存在主谓、动宾结构做为定语来修饰名词。
16(b)是以主句中的主语“the man”为疑问重心转换生成的Wh-问句。“the man ”构成了一个复杂名词词组,根据复杂名词词组限制条件,该结构中的任何 成分都不得移出,否则将产生16(b)这样的不合法句子。同理,16(c)是以由“who”引导的 定语分句的宾语为疑问重心转换生成的。该定语分句同样位于上述复杂名词词组内,就因其 中定语分句的宾语移出复杂名词结构,违反了复杂名词词组限制条件,所以产生出如18(c) 这样的不合法句子。
(c) *的那个人是张三的哥哥?
同16、17系列句一样,汉语“的那个人”构成了一个复合名词,相当于英语中的 复杂名词词组,以该复合名词中的任何成分为疑问重心转换生成的18(b)-(c)都是不合法的 ,原因是违反了复杂名词词组的限制条件。这与英语16系列句产生不合法句子的原因是一致 的 。该语言现实再次证明,英语复杂名词词组限制条件,在同等条件下,对汉语、韩语同样产 生效应,并限制不合法句子的产生。
(二)宾语结构Wh-问句转换生成
在此,讨论的重点是,由主谓、动宾结构修饰的名词短语在句子中作宾语时,该Wh-问句在 转换生成过程中英语限制条件的效应情况。
19(a) I know the teacherb his hatc.
(b) * Whoi does you know ti ?
(c) * Whati does you know the teacher ?
19(b)是以主句中的宾语“the teacher”为疑问重心转换生成的Wh-问句,19(c)是以定语 从句中的宾语“his hat”为疑问重心转换生成的Wh-问句。而二者都是不合法句子。原因 是 “the teacher ”复杂名词词组中的成分移出了该结构,违反 了复杂名词词组限制条件。
21(a) 我认识帽子c]的那位老师b。
(b) *你认识的谁?
(c) *你认识的那位老师?
21是动宾结构所修饰的名词在句中作宾语的汉语句子。其中,“的那位老师”构 成 了复合名词。以宾语“那位老师”为疑问重心转换生成的21(b)、动宾结构中的宾语“帽子 ”为疑问重心转换生成的21(c)都是不合法的句子,因为违反了复杂名词词组限制条件。这 说明汉语复合名词“的那位老师”中的任何成分同样都不得成为疑问重心,引导 Wh-问句。可见,英语复杂名词词组的限制条件对汉语同样产生了效应。
四、限制条件跨语言效应的基础这与前面出现过的主谓结构作宾语和含有副词性分句的韩、汉语句Wh-问句转换生成是完全 不同的现象。在主语和宾语结构Wh-问句转换 生成过程中,英语限制条件不仅对英语,甚至对汉语和韩语也同样产生效应,防止了不合法 句子的生成。在这一点上,英语限制条件在英语、韩语、汉语中产生了完全一致的效应。这 在三大不同类型的语言间是难得的“一致”,这个“一致”将成为重要线索,可用以探讨 “形式句法 规则何以对非形式语言及非典型形式语言产生效应?产生怎样的作用?该讨论将会超出语 言类型的关系,超出句法结构关系,超出限制条件的效应关系,论证一个更深层的语言逻辑 关系。
(一)定语—形容词语类属性特征?
从语类特征上看,定语分句的基本属性与定语相同。修饰语和被修饰语之间通常是特性与实 体 的关系。这种关系还可以分为两个次类:1、性质与实体(quality-substance),即描写形 容 词;2、限制与实体(1imitation-substance),即限定形容词。描写形容词的形类意义可解 释为“标本的品质(qualitative)特性”;限定形容词的形类意义可解释为“标本的可变(va riable)特性”。[3]定语是因其对名词的限定、修饰功能而得名。较 之其它句子成分,定语的 依附性特征明显,对名词的依附性很强。这种依附性不仅体现在语义关系上,而且也体现在 句法结构关系上。英、韩、汉形容词性分句一概如此,其原因在于定语没有独立的语义所指 。
就描写形容词的“标本的品质特性”和限定形容词的 “标本的可变特性”而言,“形容词+ 名词”结构的指称关系只能落在短语中的名词上。该短语中的形容词明示所指实体的品质特 性或限定其可变特性。就此可以判断:形容词没有独立的指称实体,即形容词具有“独 立指称性”的语义特征。同理,形容词性分句在形式上是“主-谓”、“动-宾”结构,但 整体上作为定语,其概念意义与形容词同出一辙。
(二)“—独立指称性”的形容词或定语可否成为疑问焦点?
人的思维过程运用概念做出判断,运用概念、判断进行推理。“问题或疑问”的思维模式也 不例外。任何问题都是由隐含的判断和明言的疑问两部分构成的,前者是已知的,后者是未 知的。问题的合理与否,要看问题中隐含的判断是否真实。符合客观实际的判断是真实的, 反之就是虚假的。因此,运用概念做出隐含判断是提出明言疑问的前提条件。对于形容词或 定语,人们所形成的概念是关于其所依附的名词,对其本身无法形成独立的概念,因为它 具有“—独立指称性” 语义特征所以无法判断。没有“隐含的判断”这一前提,“明言 的疑问”也就无从谈起,因而,具有“—独立指称性”的形容词或定语不能成为疑问焦点。
五、结论
英、韩、汉三种语言中的定语分句作为一个整体,其基本属性同形容词相同,依附于所修饰 的名词,没有独立的语义所指,具有“—独立指称性”语义特征。因此,作为一个整体,定 语分句不能被提问,其中的任何成分不能成为疑问重心。这是语言之外逻辑关系的限制。这 种语言之外的逻辑关系体现在语言内部,是以语言规则形式来体现的。具体而言,是以语言 转 换规则的限制条件形式体现的。准确地说,集中体现在复杂名词词组限制条件上。换言之, 普遍语法原则更多地体现在复杂名词词组的组合关系上,使英语的复杂名词词组限制条件在 跨语言中产生效应,并在它的辐射范围内限制不合法句子的产生。
参考文献:
[1]石定栩:《乔姆斯基的形式句法——历史进程与最新理论》,北京:北京 语言文化大学出版社,2002年。
[2]徐烈炯:《凡成语法理论:标准理论到最简方案》,上海:上海外语教育出版社,2 009年。
[3][美]Bloomfield, Language. New York: Holt (1955).袁家华等译著,北京:商务印书馆,1997年。
[责任编辑 全红]
C++隐式数据类型转换的研究 篇3
1 用转换构造函数进行类型转换原理
1.1 什么是转换构造函数
把有参数的构造函数用作类型转换, 称为转换构造函数 (有参数的构造函数也可不用做类型转换) 。转换构造函数作用是将基本数据类型的数据转换成类的对象;它是类的成员函数。
1.2 转换构造函数应用
5/8与5.0/8结果不同, 原因是C++执行了两种不同的操作。5.0/8匹配了两个doubl e类型的除法, C++知道如何将8转换成doub le型, 这是基本数据类型的转换。但转换用户定义的类类型, 必须由用户告知。告知方式就是定义含参数的构造函数。通常把有参数的构造函数用作类型转换, 称其为转换构造函数 (有参数的构造函数也可不用做类型转换) 。转换构造函数的作用是将其它类型的数据转换成类的对象。在构造函数中, 完成对象初始化的同时, 也可完成数据类型的转化, 只不过是由系统转化的, 所以称隐式数据类型转化。例如:定义SI类, 该类的对象表示从-128~127之间整数。
SI类重载了两个SI对象相加的操作符;因此, 可以进行两个SI对象相加的操作;如:SI s1 (2) , s2 (2) ;SI s3=s1+s2;如果是SI型变量和其他数据类型的变量进行运算, 如:s3=s1+6;;要让SI变量和整数相加, 而程序只定义了两个SI类型变量相加的运算符, 所以需提供由整数向SI类型转换的函数。其实程序已实现了这样的函数, 类SI的构造函数:SI (int val) ;就实现了这样的功能。在定义SI对象SI s (6) ;系统自动调用构造函数将整数6转化为SI类型的变量。所以类的构造函数可充当类型转换的角色。当用s3=s1+6时, 系统发现第一个操作数是SI类型的, 就寻找有没有以SI为参数类型的“+”运算符, 当找到了这个运算符时, 发现还有一个操作数的类型不对, 就将这个操作数的类型转化为SI型。因为程序定义了int型数据来构造SI对象的构造函数, 所以转型成功。系统就调用SI的成员函数operator+ () 来完成运算。
2 使用重载加运算符和类的友元函数实现
当程序出现s3=s1+2.3;因为类SI并没有double型数据来构造SI对象的构造函数, 所以。系统会首先将这个double型的数据转化为int型, 然后在利用SI的构造函数将其转化为SI对象, 即:{SI temp=int (2.3) ;//先构造一个临时的SI对象, s3=s1+temp;//直接运用operator+}。问题是:类中重载加运算符后, s3=6+s1;s3=s1+6;相同吗?加法一般满足交换率的。而对于SI和一般数据类型之间的加法是不满足交换率的。因为操作的第一操作数是int型的数, 而不是SI。类的成员函数的第一参数默认是指向这个类的对象的指针类型, 这是由系统定义好的, 无法更改。所以, 如果operator+ () 被定义为类的成员函数, 就无法通过类型转换将int型数据转化为SI来运算 (系统规定不能这样做) 解决此问题有两种方法。
方法一:将operator+ () 作为类的友元函数来定义:class SI{friend SI operator+ (const SI&, const SI&) };这样, 就不会受到成员函数的第一个参数类型的限制, 可以利用构造函数将作为第一个操作数的整数转化为SI型的数进行运算。
方法二:是保留作为成员函数的operato r+ () 的定义, 另外再重载一个operator+ () 运算符, 并将其第一个参数定义为int型的。程序如下
第一种方法简单, 只需要重载一次运算符;第二种方法需要多次重载这个运算符。而且, 重载多次容易产生二义性, 所以, 在为类的重载运算符时, 一般将运算符定义为类的友元函数, 而不是定义为成员函数。
3 用类型转换函数进行类型转换
用转换构造函数可将指定类型的数据转换为类的对象。但反过来却不能将类的对象转换为基本类型的数据 (如将一个SI类对象转换成int) 。下面介绍类型转换函数可实现这一点。类型转换函数作用是将类的对象转换成基本类型的数据。它是类的成员函数。类型转换的形式为:operator类型名 () {实现转换的语句}。在函数名前不能指定函数类型, 函数没有参数。
一些函数只接受基本数据类型的参数, 如:int abs (int val) ;若希望把SI型数据的变量传递给这个函数来求SI型数据的绝对值:SI s (-2) ;s=abs (s) ;如果想让函数如abs () 来接受SI类型的变量, 就需要定义一个将SI对象转化为int型的转换函数, 实现SI类型向int转换的函数为:Class SI{public:operator int () {return val;};函数体直接返回val的值, 这个值就是转化成的int的值。这样就可直接用SI对象调用函数abs () 了。
4 结语
类型转换构造函数实际上就是带参数的构造函数, 转换构造函数完成的是由标准数据类型 (或一个类类型) 转换至当前类类型;类型转换函数完成的是由当前类类型转换至标准数据类型。转换构造函数与类型转换函数有一个共同的功能:当需要的时候, 编译器会自动调用这些函数, 建立一个无名的临时对象 (或临时变量) , 实现类型间的转换。
摘要:在程序设计中, 常根据编程的需要, 进行数据类型转换。C++实现数据类型转换有隐式类型转换和显式类型转换。本文以自定义类型SI为例分析隐式数据类型转换原理。
关键词:C++,数据类型,构造函数,重载
参考文献
[1]王萍.c++面向对象程序设计.2002年2月第1版.北京:清华大学出版社, 345-351.
类型转换的规则 篇4
1.1 转换规则
C#语言为了满足不同场合的应用需要,提供了多种类型的数值数据,如表1所示。不同数值类型之间的转换有一个规则,即从低精度类型到高精度类型通常可以进行隐式转换;而从高精度类型到低精度类型则必须进行显式转换。
1.2 转换方法
1.2.1 隐式转换
由表1得出,数值类型主要包括byte,short,int,long,fload,double等类型,从前到后依次为低精度类型到高精度类型的排列顺序,根据转换规则各种类型的值依次可以向后自动进行隐式转换。
例:short S=100;int I;I=S;//隐式转换,由低精度到高精度的转换
即把一个short型的变量S赋值给一个int型的变量I,short型的值会自动转换成int型值,再赋给int型变量I。
1.2.2 显式转换
从高精度类型到低精度类型的数值转换则必须进行显式转换,转换规则是通过类型转换运算来实现[2]。一般形式:(类型说明符)(表达式);其功能是把表达式的运算结果强制转换成“类型说明符”所表示的类型。
例1:int I=218;float F;F=(float)I;//把I强制转换为实型。
例2:float x=1.2F;long y=3;int I=(int)(x+y);//把x+y的结果强制转换为整型。
1.3 注意事项
(1)在使用显式转换时应注意[3]:类型说明符和表达式都必须加括号,上例中,若把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
(2)无论是显式类型转换还是自动类型转换,都只是为了本次运算的需要而进行的临时性转换,并不改变被转换数据本身的类型和其值的大小。比如:double x=4.5;int y=(int)x;赋值语句中先把4.5拿出来转换成4后赋值给y,赋值后y中的值为4;而语句中的x不会发生任何变化,数据类型仍然为实型,其值仍然为4.5。
1.4 常见问题分析与处理
C#语言中数据类型转换时,可能会导致丢失精度,还可能导致其他数据类型的信息丢失。即造成非安全的转换。非安全转换是将一种数据类型转换成较短数据类型,其值超出较短类型的表示范围时所出现的错误。(1)当较大的整数转换为较短的整数类型时,超出了较短整数类型所能表示的范围,其结果是无意义的。因此在编程时需避免此种类型转换。(2)当有符号整数转换为无符号整数时,原来的符号位将不作为符号,而是作为数据的一部分,因此输出的结果也会出错。(3)双精度类型转换成单精度类型时,可能出现下述两种情况:其一,降低精度,截断尾数,保留前8位有效数字,后面的数字无意义;其二,若数值超出了单精度所表示的范围,则得到的数据无意义;因此,在实际编程过程需仔细,遇到较大的数据,或对精度要求比较高时,避免进行此种类型的转换。(4)浮点数转换成整型数据时,舍弃小数,不进行四舍五入。因此,若需要计算结果较高的精度,应尽量避免此类型的转换。
2 数值字符串和数值之间的转换
2.1 数值转换成数值字符串
将数值转换成数值字符串可采用ToString()方法。许多编程语言和类结构都提供了根类型,层次结构中的其他对象都从它派生而来。C#和.NET也不例外。在C#中,object类型就是最终的父类型,所有内置类型和用户定义的类型都从它派生而来。所有的类型都隐含地最终派生于System.Object类,重写Object类的ToString()方法,这样每一个数据类型类都有一个void ToString()方法。所有数值型的void ToString()方法都能将数值转换为数值字符串。如int gg=456;string str=gg.ToString();结果为str=“456”。
2.2 数值字符串到数值类型的转换
在C#中,每个数值数据类型类都包含一个static Parse()方法,允许将数值字符串转换成对应的数值类型。以一个float类型的转换为例:float f=float.Parse(″543.21″);其结果f的值为543.21F。当然,其它的数值类型也可以使用同样的方法进行转换。如int.Parse(″124″)或double.Parse(″456.78″)分别将一个string类型转换为int或double数值类型。
3 使用System.Convert类进行类型转换
System.Convert类为支持的转换提供了一整套方法。提供一种与语言无关的方法来执行转换,而且可用于针对公共语言运行库的所有语言。虽然不同的语言可能会使用不同的技术来转换数据类型,但Convert类可确保所有的公共转换都可通过一般格式来使用。
3.1 转换规则
Convert类支持多种数据类型的转换。支持从String转换为数字类型、从DateTime类型转换为String类型以及从String类型转换为Boolean类型等。Convert类执行检查过的转换,并在转换不受支持时总会引发异常。异常通常为OverflowException。
3.2 转换方法
利用Convert类的相关方法实现数据类型的相互转换,可以利用它将一种类型转换成另一种类型。
例1:将String值转换为Boolean值。
例2:将字符串转换为数字值。
4 数据类型转换的实际应用
下面以一个简单的网络计算器示例来介绍数据类型转换的实际应用。网络计算器是通过Web页面在网站上提供的计算服务,常见的形式有:住房公积金贷款利率计算器、商品价格折扣计算器、债券投资收益计算器等,因其方便、实用,被广泛应用到许多专业网站提供的服务中[4]。本项目将通过制作一个个人存款计算器,来分析其中的数据类型转换方法。以下为存款计算的主要代码:
通过以上应用实例得出如下分析结果:
(1)在程序设计过程中,若需用到运算符时,应注意运算符两侧的数据类型是否一致,若不一致应考虑数据类型转换问题。(2)对于一些程序结果未知时,一定需慎用类型转换,在必要时应使用强制类型转换。(3)对运算结果的精度要求较高时,尽量使用double类型。(4)数据类型转换在实际编程中应用非常广泛,值得引起注意。
5 结束语
描述了在C#语言中数据类型转换的规则和转换的方法,以及在数据类型转换中需注意的事项和常见问题分析。
摘要:本文描述了在C#语言中数据类型转换的规则和方法,以及在数据类型转换中需要注意的事项和常见的问题分析,并通过具体示例探讨数据类型转换的实际应用。
关键词:C#,数据类型转换,应用,规则,分析
参考文献
[1]Anders Hejlsberg,Scott Wiltamuth,Peter Golde著.C#编程语言详解[M].张晓坤,谭立平,车树良,译.北京:电子工业出版社,2004.
[2]毛丽娜.C语言教学中强制类型转换运算运用探讨[J].广州:现代计算机.2009(12):135.
[3]朱伟.C语言中三种数据类型转换之比较[J].北京:办公自动化,2008(10):24.
类型转换的规则 篇5
C语言到目前为止仍然是国内外广泛使用的程序设计语言之一,同时也是国内外大学开设的程序设计基础课程,很多学生把C语言作为国家计算机等级考试的首选语言。实际上,用C语言编写的程序,就是描述对数据的处理过程,而数据都是以某种特定的形式存在的(例如:整数、字符等)。也就是说,C程序中用到的所有数据都必须指定其数据类型,因此必须掌握C语言程序中的这些数据类型。而运算是对数据进行操作、处理的过程,是通过运算表达式描述的。在C语言的表达式中,通常参与运算的数据类型不一定完全一致。C语言允许不同类型的数据混合运算,但是,要先将它们转换成相同的数据类型,再进行运算。本文就将对数据类型转换的方式和在转换过程中常见的问题进行分析探讨。
1 数据类型转换的方式
数据类型转换一般可分为隐式转换和显式转换,它们分别也可称为自动转换和强制转换。
1.1 隐式转换
常见的隐式转换有四种,分别是:一般算术转换、输出转换、赋值转换、函数调用转换。
(1)一般算术转换即通过某些运算符将操作数的值从一种类型自动转换成另一种类型,而这一规则为“由低级向高级转换”,转换规则如图一所示。
若参与运算变量的类型不同,则先转换成同一类型,然后进行运算。转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int型转成long型后再进行运算。所有的浮点运算都是以双精度进行的,即使仅含float单精度变量运算的表达式,也要先转换成double型再作运算。char型和short型参与运算时,必须先转换成in型。
(2)输出转换指的是待输出的操作数的类型与输出的格式不一致时进行的数据类型的转换。例如:printf(“%u”,-2),其输出结果为:65534。系统把负号作为数值的一部分处理,然后输出转换后的值。
(3)赋值转换是指在赋值运算过程中将赋值运算符右侧的操作数的类型转换成左侧操作数据的类型。具体的转换有:
(1)浮点型与整型;(2)单、双精度浮点型;(3)char型与int型;(4)int型与1ong型;(5)无符号整数。
(4)函数调用转换是指当实参类型和形参类型不一致时所进行的转换。
例1:
在执行multiply函数时,系统会将a与b转换成整型值给形参x,y。
1.2 显式转换
显式转换一般有两种方法,强制性数据类型转换和利用C语言提供的标准函数转换。
强制类型转换是将一种类型的数据强制转换成为另一种数据类型。其格式为:(数据类型标识符)表达式;作用是将表达式的数据类型强制转换成“数据类型标识符”所表示的类型。
例2:
2 常见问题分析
C语言在数据类型转换中常见的错误有以下几种:非安全转换、算术运算“/”、“%”与操作数不匹配、输入输出格式错误。下面就以上几种常见错误进行实例分析。
2.1 非安全转换是将一种数据类型转换成较短数据类型,其值超出较短类型的表示范围时所出现的错误
2.1.1 较大的整数转换为较短的类型
当较大的整数转换为较短的类型时,超出了较短类型所能表示的范围,因此结果是无意义的。如:long i=123456printf(“%d”,i);其输出结果为:-7616。当较长的无符号数转换成较短有符号数时,当无符号数值超出了有符号数类型的表示范围,在转换过程中仅转换了有符号数类型能够表示的较低位,如:unsigned j=65535;int i;i=j;printf(“%dn”,i);程序执行上述语句后输出为-1。C语言系统一般不检测这种类型的错误,大部分的编译器在可能会出现非安全转换时都不会给出警告信息。运行时,若发生此类型错误,任何C系统都不会中断,也不会给出出错信息,因此在编程时需避免此类型转换。
2.1.2 有符号负数转换为无符号数
输出结果为:65535,这是因为-1在存储单元中的存放形式(以补码形式存放)如下:
当有符号数转换为无符号数时,原来的符号位将不作为符号,而是作为数据的一部分。
2.1.3 双精度类型转换成单精度类型
例5:
由于双精度类型转换成单精度类型时,可能出现上述两种情况:其一,降低精度,截断尾数,保留前来位有效数字,后面的数字无意义,如例5;其二,若数值超出了单精度所表示的范围,则得到的数据无意义,也可能是Infinity或NaN之类的值,且C系统不提示出错也不警告用户,如例6。因此,在实际编程过程需仔细,遇到较大的数据,或对精度要求比较高时,避免进行此类的转换。
2.1.4 浮点数转换为整型
当浮点数转换为整型数据时,舍弃小数,不进行四舍五入。如:double j=12.999999;int i;i=j;则j的值为13。因此,若需要计算结果尽可能高的精度,应尽量避免此类型的转换。若较大的浮点数转换为整型数据,所得到的数据对用户是无意义的,如:double j=121234567.89;int i;i=j;printf(“%dn”,i);其输出结果为:-7033。
2.2 算术运算“/”、“%”与操作数不匹配
由于浮点数未定义”%”运算,因此执行例7时,会编译出错,系统提示出错信息:error:illegal use of floating point in function main(在main函数中非法使用浮点数)。例8的程序设计者期望的结果是3或2.5,但实际输出结果为2。由于在C语言中,两个整数执行“/”运算,其结果只保留整数部分,小数位直接舍弃。例9的输出结果为:-1,-1,1,1,原因为在“%”运算中,若两操作数中其一为负数,则结果的符号与左操作数的符号相同,与右操作数的类型无关。在程序设计中若遇到算术“/”、“%”时,需注意运算符两侧的操作数类型是否一致,对于不一致的类型可采用强制类型转换运算使其一致,可以避免出现上述错误。
2.3 输入输出格式错误
在例10中变量j与k都是long double型,在第二个scanf()语句中错用了%g的格式,说明大部分编译器不检测这种错误,也不提示出错信息。程序获取输入的数据,将被转换成格式说明符所指定类型,然后保存到指定的存储区域中。由于在转换过程中未作任何修改,因此变量中存储的是错误信息,由此产生的结果无意义,如:int t=2;printf(“%f”,t)执行上述语句会出现printf:float point formats not linkde的出错信息。
3 结束语
本文介绍了C语言中类型转换的方式,并探讨了几种常见的容易出错的问题。在程序设计过程中,若需用到运算符时,应注意运算符两侧的数据类型是否一致,若不一致应考虑数据类型转换问题。对于一些程序结果未知时,一定需慎用类型转换,在必要时应使用强制类型转换。对运算结果的精度要求较高时,尽量使用double类型。
摘要:在C语言的表达式中,通常参与运算的数据类型不一定完全一致,这就需要把它们转换成相同的数据类型,再进行运算。本文对数据类型转换的几种方式及转换过程中常见的问题进行分析探讨。
关键词:数据类型,隐式转换,显式转换,常见问题
参考文献
[1]谭浩强,张基温,唐永炎.C语言程序教程[M].北京:高等教育出版社,1998.
[2]谭浩强.C程序设计[M].北京:清华大学出版社,2005.
类型转换的规则 篇6
图像加密是一种能够有效防止图像信息外泄的技术手段, 对此, 诸多学者提出了很多的数字图像加密算法。如混沌系统、DNA序列、元胞自动机以及分阶梅林变换等技术。其中, 以混沌系统研究得更为广泛。混沌系统具有良好的随机性、复杂的相空间以及难以预测性, 其所生成的代码具有较强的抗攻击能力[3,4]; 使其非常适合应用于数字图像加密领域。如刘乐鹏等人[5]采用Logistic混沌映射耦合位运算的加密方案对图像进行了加密, 仿真结果显示该算法能够显著提高了加密速度, 提高了算法的安全性。但是由于Logistic混沌属于一维系统, 其安全性仍然处于较低水平。G. Chen等人[6]利用三维混沌CAT映射对图像加密进行了研究, 设计了具有实时安全匀称加密机制, 采用三维混沌CAT映射置乱明文图像与加密图像之间的关系, 仿真结果表明该算法高度安全, 密钥空间大。但是, 该算法的计算复杂度很高, 降低了其计算效率。Mao Y. 等人[7]提出了一种基于三维Logistic混沌映射的图像加密方法, 并对该算法进行了实验验证, 结果表明该算法加密机制高度安全。但是由于三维混沌映射的计算复杂度很高, 导致了巨大的时间成本, 且难易实现。
为了克服当前的加密系统难以同时兼顾高计算机效率和高安全性的不足, 防止混沌映射的输出序列出现局部单调现象, 现将三个1D混沌映射 ( Lo- gistic映射、Chebyshev映射和Tent映射) 嵌入到一个单一的系统中去, 设计了多个1D混沌映射相融合的一维参数转换混沌耦合系统和一个混沌序列优化机制; 并定义了该耦合系统对应的1D、2D变换规则, 提出了基于参数转换混沌系统及其1D、2D变换规则的图像加密算法。设计的参数转换混沌耦合系统仍然是一个1D混沌映射, 因此具有高计算效率、 低的计算复杂度等优点; 而且具有更复杂的混沌行为和更大的混沌区域, 继而显著增强了算法的安全性。混沌序列优化机制有效地消除了1D混沌映射的实值序列的值域差别大, 易出现局部单调现象等不足。借助MATLAB软件对该算法以及其他加密算法的安全性进行了对比仿真实验, 通过对比分析来凸显算法的优异性能。
1 一维参数转换混沌耦合系统的设计
通过将Logistic映射、Chebyshev映射和Tent映射进行耦合到单一系统中去, 得到一维参数转换混沌耦合系统, 其系统结构如图1 所示。从图1 中可以看到, Logistic混沌映射的输出值为控制因子, 是用来确定另外两个混沌映射中的其中之一, 以输出1D参数转换混沌耦合系统的混沌序列。
一维参数转换混沌耦合系统模型如下
式 ( 1) 中, xi +1、xi分别为该系统的第 ( i + 1) 、i个状态值; S ( xi) 代表Chebyshev混沌映射; T ( xi) 代表Tent映射; Ci为Logistic映射的输出值。
S ( x) 的模型如下
式 ( 2) 中, xi为系统变量, 且xi∈ { - 1, 1} ; k为控制参数, k =4 时, 处于混沌状态。
T ( x) 的模型如下
式 ( 3) 中, xi为系统变量, 且xi∈ { 0, 1} ; β 为控制参数, β ∈[0, 2]。
Ci的计算模型如下
式 ( 4) 中, μ 为控制参数, μ ∈[0, 4]。
从图1 也可以看到, 该耦合系统结构简单, 耦合了3 个普通的1D混沌映射, 且易实现。该系统的输出值由3 个参数 ( k , β 以及 μ ) 和两个初值 ( 模型 ( 4) 的C0和模型 ( 1) 的x0) 共同决定。在不同的条件下, 一维参数转换混沌耦合系统不但能够切换到Chebyshev映射或Tent映射, 而且还能产生新的混沌序列, 这种转换由Logistic混沌映射的 μ 决定:
( 1) 如果 μ ∈[0, 2], 且0 ≤ Ci< 0. 5 , 则一维参数转换混沌耦合系统恢复到Tent映射。
( 2) 如果 μ ∈[2, 3], 且0. 5 ≤ Ci< 1 , 则一维参数转换混沌耦合系统恢复到Chebyshev混沌映射。
( 3) 如果 μ ∈[3, 4], 且0 ≤ Ci< 1 , 则一维参数转换混沌耦合系统是一个新的系统, 将产生新的混沌序列。
模型 ( 1) 嵌入了三个普通的1D混沌映射, 比当前的任何一个单一的1D混沌映射拥有更复杂的混沌行为。采用了信息熵H ( m) 来评估一维参数转换混沌耦合系统的混沌行为
式 ( 5) 中, L为灰度等级, p ( mi) 为mi出现的概率。
首先改变模型 ( 1) 的3 个参数 ( k , β 以及 μ ) , 固定型式 ( 4) 的C0, ( C0= 0. 4) 和模型式 ( 1) 的x0, ( x0= 0. 25) ; 然后测试模型式 ( 1) 以及3 个1D混沌映射输出序列的信息熵。测量结果如表1 所示。 从表1 中可知, 在同样的条件下, 设计的一维参数转换混沌耦合系统的信息熵要显著大于3 个传统的单一1D混沌映射。这表明该耦合系统的输出序列时随机分布的, 其伪随机性能更好。原因是单一的1D混沌映射的混沌区域小, 只能在指定的有限区域表现出混沌行为; 而一维参数转换混沌耦合系统拥有3 个控制参数, 使其拥有更大的动态混沌区域。即使在最坏条件下, Logistic混沌映射失去了混沌行为, 该耦合系统可以切换到其他两个1D混沌映射, 继续保持混沌状态。
和其他混沌系统一样, 设计的一维参数转换混沌耦合系统对初值和和参数具有强烈的敏感性能。 测试一维参数转换混沌耦合系统的两个输出序列间的相关性来评估其对初值 ( C0和x0) 的敏感性能, V1、V3序列是初值x0= 0. 65、C0= 0. 27 时对应的耦合系统输出序列; V2、V4是初值x0、C0减去微扰值 ( δ = 10-14) 时对应的输出序列。仿真结果如图2 所示。从图中可以看到, 所有的点都是均匀分布在整个数据范围内, 并不是聚集成对角线。这意味着即使初值发生了极其微小的变化 ( δ = 10-14) , 一维参数转换混沌耦合系统所输出的序列是截然不同的。
2 一维参数转换混沌耦合系统的变换规则
定义一维参数转换混沌耦合系统的1D、2D变换规则。通过1D转换规则将混沌序列变换成整数序列; 通过2D变换规则对图像进行置乱处理。
2. 1 定义1D变换规则
通过引入补偿因子, 设计了1D变换规则。
设置好模型 ( 1) 的初始条件, 迭代计算n次, 输出序列{ xi} , i = 1, 2, …, n 。根据1D变换规则将序列{ xi} 变换成整数序列{ γi} , 该序列拥有n个不重复的整数元素。1D变换规则如下
式 ( 6) 中, γi为变换后的整数; θ 为补偿因子, 0 ≤ θ < 1 ; [·]代表floor函数, mod代表取余操作。
通过1D变换规则, 可以得到置乱整数序列{ 1, 2, …, n} 。改变模型 ( 1) 的初始条件和控制参数, 可以得到不同的混沌序列{ xi} , 继而得到了不同了置乱整数序列{ γi} 。
由于一维参数转换混沌耦合系统所产生序列{ xi} , i = 1, 2, …, n中可能有一些元素是重复的, 因此有必要设置一个补偿因子 θ 来消除这种不利因素, 其缺省设置 θ =0。当{ xi} , i = 1, 2, …, n有相同的元素时, 应设置不同的补偿因子 θ 。通过这样的方法可以将{ xi} 中不同位置的相同元素转变成不同的整数元素, 得到不重复的输出序列{ γi} 。假设混沌序列{ xi} = { 0. 1, 0. 2, 0. 5, 0. 8, 0. 4, 0. 2, 0. 9, 1, 0. 6, 0. 3} , n = 10。补偿因子 θ 设置为0, 但当x8= 0. 1 和x6= 0. 2 , 设置 θ = 0. 5, 最终得到整数序列{ γi} = { 2, 3, 6, 9, 5, 8, 10, 1, 7, 4} , 该序列为{ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10} 的重排序列。
1D变换规则在置乱数据流领域有着独特的优势, 也同样可以用于改变图像的像素位置; 但是由于1D变换规则是通过逐行方式完成的, 导致了很高的计算代价。为了克服这个缺陷, 故定义了一个2D变换规则来置乱图像。
2. 2 定义2D变换规则
假设明文图像尺寸为M × N , γr和 γc是经过1D变换规则处理后的整数序列, 二者的序列长度分别为M和N 。2D变换规则定义如下
式 ( 7) 中, Wr和Wc是行矩阵和列矩阵; Z是置乱图像。Wr和Wc模型如下
式中, i, j, k, l为整数, 且1 ≤ i, j ≤ n, 1 ≤ k, l ≤ n 。
2D变换规则是一种改变二维数据矩阵中的数据流的有效和可靠方法, 特别是灰度图像。只需使用1 次2D变换规则即可彻底地改变图像像素位置。如图2 所示。从图中可知, 2D变换规则不存在安全性恢复的问题, 在迭代1 次时, 就快速位于稳定状态; 且具有很高的置乱度, 高达100%。虽然文献[8]也有较快的计算效率, 但是其置乱度比较低, 为96. 52% ; 文献[9]拥有较高的置乱度, 高达98. 67% , 但是其计算效率很低, 需要迭代4 轮方可进入稳定状态。可见2D变换规则能够同时拥有较高的置乱效率和计算效率。
置乱度 φ 计算模型如下[10]:
式 ( 10) 中, ‖S'M ×N‖ 为置乱图像中连续区域个数; ‖SM ×N‖ 为初始图像中连续区域个数。M × N为图像尺寸。
3 本文算法设计
算法流流程框架图如图3 所示。从图3 中可知, 该算法是包括了三个阶段: 替代、置乱以及扩散阶段。通过替代阶段能够获得平坦直方图, 有效地抵御统计攻击能力; 根据置乱子序列和2D变换规则进行置乱图像, 能够彻底改变像素位置; 根据加密机制对置乱图像进行扩散, 彻底改变像素值。通过构造“替代—置乱—扩散”结构, 使密文获得良好的扩散和混乱性能, 显著提高算法的安全性。
3. 1 算法设计
( 1) 假设明文图像尺寸为M × N 。设置好初始条件 ( k , β 、μ 、C0以及x0) 。
( 2) 通过以下模型更新Logistic混沌映射的初值C0i
式 ( 11) 中, C0i和C0 (i-1) 为在第i个和第 ( i - 1) 次替代-置乱过程中的Logistic映射初始值; D代表尺寸为M × N的图像I ( M, N) 收集信息。
式中, hashi为第i个十六进制数; mod为取余操作。
( 3) 根据动态更新的初值C0i迭代计算模型 ( 1) , 得到一维参数转换混沌耦合系统的输出序列{ xi} , 该序列长度为l :, 其中, ls= M ×N , 用于替代; lp= M + N , 用于置乱。
( 4) 根据1D变换规则将序列{ xi} 变换成整数序列{ γi} 。
( 5) 将步骤 ( 4) 得到的序列{ γi} 分成两部个子序列{ γs} 和{ γp} , 其中, { xs} 的长度为ls; { xp} 的长度为lp; 并用子序列{ γs} 对图像进行替代。 替代模型如下
式中, [·]代表floor函数; m, n, k均为正数, 1 ≤ m ≤ M , 且1 ≤ n ≤ N ; xs ( k) 代表用于替代的1D参数转换混沌耦合系统的输出序列; E ( m, n) , I ( m, n) 分别为替代过程中的输出图像和输入图像; F为输入图像的最大值, 如灰度图像的最大值F =256; l为序列长度。
( 6) 根据2D变换规则, 利用子序列{ γp} 对步骤 ( 5) 输出的替代图像进行置乱处理。
( 7) 为了防止混沌序列出现局部单调缺陷, 设计了混沌序列优化机制, 对混沌序列{ xi} 进行优化。混沌序列优化机制如下
式 ( 17) 中, xi' 为优化后的序列值, xi为优化前的序列值; round ( x) 代表距离x最近的整数。
( 8) 根据步骤 ( 7) 得到的优化序列{ xi'} , 对置乱图像进行加密。加密机制如下
式 ( 18) 中, Pire为置乱后的图像的像素值; yi为密文像素值, y0设为100; xi'代表优化后的序列值; 为异或操作。
由于解密是加密的逆过程, 因篇幅有限, 这里不作介绍。
4 仿真结果与分析
4. 1 加密效果对比分析
为了体现加密算法的优异性能, 故设立了对照组。对照组为文献[8]和文献[9]。为了便于描述, 令文献[8]为A算法; 文献[9]为B算法。用MAT- LAB仿真软件测试这些算法性能。仿真环境为: 因特尔3. 5 GHz双核CPU, 4GB的内存, 运行系统Windows 7. 0。
输入一个尺寸为256 × 256 的明文图像, 灰度等级为256。仿真结果如图4 ( b) ~ 图4 ( d) 所示。从图中可知, 经加密算法和B算法处理后, 图像的信息得到了充分混淆与扩散, 没有任何信息泄露, 加密质量更好, 如图4 ( b) 和图4 ( d) 所示, 其加密时间分别为103 ms、3. 1 s; 而经过A算法处理后, 其加密效果不佳, 存在信息泄露, 如图4 ( c) , 加密时间分别为98 ms。
可见, 算法的计算效率与单一的1D混沌映射旗鼓相当, 但是本文算法的安全性却显著高于单一的1D混沌映射; 与3D混沌映射相比, 在安全水平相差无几的条件下, 该算法的计算效率是高维混沌映射计算的30 倍。
4. 1 灰度直方图
图5 为本文算法及对照组算法处理后的灰度直方图仿真结果。从图5 ( a) 可知, 初始图像像素点的分布随着灰度级别的变化呈现出不均匀态势, 表明其安全性较低, 易受到攻击。而经本文算法与B算法加密后的密文, 其灰度直方图发生了质变, 如图5 ( b) 和图5 ( d) 所示, 其像素分布均匀, 表明该算法能够显著提高密文的伪随机性与冗余性这表明此算法具有理想加密效果, 加密机制高度安全; 而A算法的直方图同样呈现分布不均态势, 如图5 ( c) 所示。
4. 2 密钥空间
密钥空间越大, 其抵抗各种攻击能力越强。根据该算法的描述可知: 其密钥空间由参数k 、β 、μ 和初值C0、x0构成。假设计算精度达到10- 14, 则本文算法的密钥空间为 ( 1014) 5= 1070, 该密钥空间远大于理论值2100。可见, 本文加密算法的密钥空间是巨大的, 可有效抵御穷举攻击能力。
4. 3 密钥敏感性分析
为使本文算法能够很好地满足雪崩效应, 对密钥K ( k = 3. 89, β = 1. 76, μ = 3. 95, x0= 0. 65, C0=0. 27) 进行了测试。通过一个微扰值 ( δ = 10- 14) 来改变密钥K中x0, 其他值不变。仿真测试结果如图6 所示。经初始密钥和修改后密钥的密文图像看起来似乎没什么区别; 但从二者的差异及其直方图可以看到, 即使密钥K是经过10- 14这样微小的变化, 其产生的密文则是截然不同的。
这表明本文算法具有较强的密钥敏感性能, 能够满足雪崩效应。
4. 4 相邻两像素点的相关性分析
高度安全的加密系统应能有效消除相邻像素点间的相关性。在初始与密文图像中随意择取3 000 对相邻像素点, RXY的计算模型如下
式 ( 19) 中, X与Y代表的是图像相邻像素点的灰度值。σX、σY分别代表X 、Y的标准偏差; μX、μY分别代表X 、Y平均值;
图7 是水平线上的加密前后图像里任意两个相邻像素点的相关性测试结果。如图7 ( a) 所示, 明文图像的相邻像素值聚集为一条对角线 ( x = y) , 这表明其相邻像素点间的相关性很高, 达到0. 976 9; 而经过本文算法加密后, 其像素值呈现均匀分布, 如图7 ( b) 所示, 说明本文算法能够以有效消除其相关性, 约为-0. 003 7, 趋于0。
其他两个方向的相邻像素点的相关性实验结果见表1。从表中可知, 本文加密算法能够显著消除图像相邻像素点间的相关性。
5 结论
为了使加密系统不但具有1D混沌映射的高计算效率、低的计算复杂度等独特优点, 而且还具有较高的安全性, 本文将Logis- tic映射、Chebyshev映射和Tent映射嵌入到一个系统中去, 设计了一维参数转换混沌耦合系统; 并针对混沌映射的输出序列易出现局部单调现象等不足, 设计了一个混沌序列优化机制; 且定义了该耦合系统对应的1D、2D变换规则, 用1D变换规则用于将本文混沌耦合系统的输出序列转换成整数序列; 再利用2D变换规则对图像进行置乱; 继而提出了基于参数转换混沌系统及其1D、2D变换规则的图像加密算法。该算法在硬件和软件方面都易于实现, 且拥有更大的动态混沌区域。在不同的条件下, 一维参数转换混沌耦合系统不但能够切换到Cheby- shev映射或Tent映射, 而且还能产生新的混沌序列。并对该算法进行了仿真实验验证, 结果显示该算法拥有优异的加密质量, 算法高度安全, 计算效率高, 且具备很强的密钥敏感性能。
摘要:1D混沌映射具有结构简单以及高的计算效率等独特优点, 但其输出序列的值域差别大, 易出现局部单调现象;且其安全性较低。为了继承一维混沌映射的优点;解决当前加密系统普遍难以同时兼顾高安全性与高计算效率等难题, 设计了一维参数转换混沌耦合系统和一个混沌序列优化机制, 并定义了该耦合系统对应的1D、2D变换规则, 提出了基于参数转换混沌系统及其1D、2D变换规则的图像加密算法。首先迭代一维参数转换混沌耦合系统, 得到混沌序列;然后利用1D变换规则将混沌序列转换成整数序列;并将该整数序列分割成两个子序列, 用其中的一个子序列对图像进行替代;再用另外一个子序列根据2D变换规则对替代图像进行置乱;最后根据序列优化机制对混沌序列进行优化后所得到的新序列来加密图像。MATLAB仿真结果显示:与其他算法相比, 加密质量更好、算法高度安全、密钥空间更大。
关键词:一维参数转换混沌耦合系统,变换规则,混沌序列优化机制,替代
参考文献
[1] 王琳娟.基于Logistic映射的多重图像加密技术.科学技术与工程, 2011;11 (8) :1818—1821
[2] 黄雨春, 王友仁.基于分数阶小波变换的图像加密方法.科学技术与工程, 2013, 13 (8) :1626—1631
[3] Ahmed A.Abd El-Latif, Li Li, et al.A new approach to chaotic image encryption based on quantum chaotic system, exploiting color spaces.Signal Processing, 2013;93 (11) :2986—3000
[4] Wang Zhen, Huang Xia, Li Yuxia, et al.A new image encryption algorithm based on the fractional-order hyperchaotic Lorenz system.Chinese Physics B, 2013;22 (1) :010504—1—010504—7
[5] 刘乐鹏, 张雪峰.基于混沌和位运算的图像加密算法.计算机应用, 2013;33 (4) :1070—1073
[6] Chen G, Mao Y, Chui C K.A symmetric image encryption scheme based on 3D chaotic cat maps.Chaos, Solitons&Fractals, 2004;21 (18) 749—761
[7] Chen G, Mao Y, Chui CK.A symmetric image encryption scheme based on 3D chaotic cat maps.Chaos Solitons Fractals, 2004;27 (21) :749—761
[8] Wang X, Teng L, Qin X.A novel color image encryption algorithm based on chaos.Signal Processing, 2012;37 (92) :1101—1108
[9] Rodríguez-Sahagún, M.T., Jaimes-Retegui R, López-Mancilla D.Image encryption based on logistic map for secure communication.Signal Processing, 2010;45 (62) :798—803
类型转换的规则 篇7
关键词:大学生,就业歧视,歧视类型
随着大学招生规模的日益扩大, 高校毕业生的就业问题日益受到人们的关注。大学生就业不仅仅面临一般的劳动就业问题, 还附带劳动力市场上的各种歧视问题。就业中的各种歧视严重破坏社会公平原则, 使大学生毕业后不能成功找到工作, 影响他们的社会定位, 造成人才的不流通, 人力资源浪费。当他们因为就业歧视使得求职过程连连受挫, 遇到不公平对待, 会造成一定的社会压力, 影响社会稳定。其中, 主要的几种大学生就业歧视有以下这六种:
一、性别歧视
女大学生不断受到就业歧视是招聘过程中的主要现象, 尤其是在二胎政策开放之后变得更加严重。绝大多数用人单位对女性都形成了固有的偏见, 他们认为女性天生能力就弱于男性, 并且女大学生就业后一般会考虑结婚生子, 之后的婚假、产假会给用人单位带来损失, 女性的带薪休假使他们必须承担付了工资却没有劳动力工作的辛苦局面。于是, 在这些想法下, 越来越多的工作单位拒绝招聘女大学生, 甚至有国家行政机关招公务员时, 公然声明只招聘男性。笔者认为, 二胎政策实施后, 用人单位面临着女性员工第二次休产假的“风险”, 如果不愿意承担, “二胎”可能会成为女大学生的“隐形门槛”, 甚至影响到某些在职女性的工作。如前段时间的某场招聘会上, 有部分单位的招聘启事上, 甚至标明“要求已婚已育”, 这就是在政策出台后, 公然侵犯女性就业权利。
二、年龄歧视
年龄歧视主要是在招聘广告中出现, 例如: 招收文秘人员 ( 要求女性) , 年龄在20 岁- 25 岁。因为中国近些年的毕业生众多, 就业结构年轻化, 很多用人单位在招聘时苛刻的限制了年龄界限, 虽然是为单位增加新血液, 但这种拒绝部分同样优秀的中年求职者的做法实为不妥。年龄歧视还针对某些没到法定退休年龄的员工, 被单位影响工作效率为由拒绝升迁, 提前退休。
三、地域歧视
现在很多用人单位只招聘有本地户口或在本地有固定住房的人。因为固定的户口决定了求职者工作的稳定性, 不会因为各方面原因提出辞职。但是它也限制了那些不是本地的, 刚毕业的大学生们寻求工作。使乡县与城市, 城市与城市之间难以进行人才流动, 限制大学生们公平就业的权利。
四、学历歧视
针对大学就读学校的学历歧视也逐渐出现在就业难原因中。用人单位会在招聘简章中限制要求硕士、博士或海归人员, 隔离了大部分求职者, 毕竟就业人员中大部分还是普通高校毕业生。而刨除硕士博士的要求, 用人单位对本科生也限制了要求, “非211、985 高校毕业的学生不要”。这要求大大难住了普通求职学生, 他们连面试的机会都没有就被拒绝在求职潮里。
虽然我国现在有《就业促进法》要求实现大学生的平等就业权, 但实际上很多单位的学历歧视严重, 又没有有关部门关注, 实际上并不能保障人们的权利。
五、外貌歧视
外貌也是歧视的一部分。在当今的国内, 社会上普遍颜控, 认为颜即“正义”, 长得好看的人做了错事也可以被原谅。相反, 长得不那么好看的, 就潜意识认为对方不优秀。而外貌多由遗传因素决定, 这不是个人所能控制的。用人单位虽然不能在招聘公告上对求职者的外貌做出规定, 但是面试时, 相貌未“达标”的应聘者, 当然会被淘汰, 丧失了工作的权利。
六、健康歧视
健康的体魄对任何人都很重要, 它是我们顺利工作, 努力为用人单位服务的根本保证。更匪夷所思的是, 部分招聘单位在不了解应聘者病史的情况下, 拒绝了非传染性, 甚至仅是遗传病的大学生, 侵犯别人的就业权。
刚毕业的大学生们都拥有着青年人的活力和激情, 他们满怀希望去创造社会财富。但在大学生就业过程中, 这些不公平的条件限制着学生发展自身, 多层的就业歧视挑战着就业公平, 严重影响了大学生们积极的就业心态。
且大学生就业歧视导致了大学生们就业难, 使得个人对自身的教育投资 ( 学习) 不能及时转换成为自身他收益 ( 工资) , 这就降低对自身的教育投资, 即, 使部分大学生趋向于大学毕业后就找工作, 哪怕工作不如意也趋之如骛。如果因为就业歧视导致不能达到优化的就业配比, 将会造成人才浪费, 人才流失。
由以上这些信息看来, 反对就业歧视、促进公平就业是一项长期的任务。因此, 制定一部较完善的《反就业歧视法》, 构建健全的反就业歧视执法与监督体系, 才能为大学生们提供有力的法律保障。同时也要加强反就业歧视的宣传, 创造一个平等就业的环境, 以实现我国的平等就业权, 达到实质上的平等。
参考文献
[1]俞萍.女大学生就业性别歧视现象及其对策研究[D].安徽大学, 2010.
[2]邓佑文, 李长江.大学生就业歧视的法学分析——以平等权为视角[J].黑龙江高教研究, 2007.