关闭

关闭

关闭

封号提示

内容

首页 关于符号扩展.doc

关于符号扩展.doc

关于符号扩展.doc

上传者: 你玷污了我的视线_ 2018-06-14 评分 0 0 0 0 0 0 暂无简介 简介 举报

简介:本文档为《关于符号扩展doc》,可适用于IT/计算机领域,主题内容包含关于符号扩展关于符号位扩展关于符号位扩展一、短数据类型扩展为长数据类型、要扩展的短数据类型为有符号数的进行符号扩展即短数据类型的符号位填充到长数据类符等。

关于符号扩展关于符号位扩展关于符号位扩展一、短数据类型扩展为长数据类型、要扩展的短数据类型为有符号数的进行符号扩展即短数据类型的符号位填充到长数据类型的高字节位(即比短数据类型多出的那一部分)保证扩展后的数值大小不变。如:charx=bshorty=x则y的值应为b:charx=bshorty=x则y的值应为b、要扩展的短数据类型为无符号数的进行零扩展即用零来填充长数据类型的高字节位。如:unsignedcharx=bshorty=x则y的值应为b:unsignedcharx=bshorty=x则y的值应为b二、长数据类型缩减为短数据类型如果长数据类型的高字节全为或全为则会直接截取低字节赋给短数据类型如果长数据类型的高字节不全为或不全为则转会就会发生错误。三、同一长度的数据类型中有符号数与无符号数的相互转化直接将内存中的数据赋给要转化的类型数值大小则会发生变化。令短类型扩展为长类型但短类型与长类型分属有符号数与无符号数时则先按规则一进行类型的扩展再按本规则直接将内存中的数值原封不动的赋给对方。附:有符号数的转换从到方法charshort符号位扩展charlong符号位扩展charunsignedchar最高位失去符号位意义变为数据位charunsignedshort符号位扩展到short然后从short转到unsignedshortcharunsignedlong符号位扩展到long然后从long转到unsignedlongcharfloat符号位扩展到long然后从long转到floatchardouble符号位扩展到long然后从long转到doublecharlongdouble符号位扩展到long然后从long转到longdoubleshortchar保留低位字节shortlong符号位扩展shortunsignedchar保留低位字节shortunsignedshort最高位失去符号位意义变为数据位shortunsignedlong符号位扩展到long然后从long转到unsigneddoubleshortfloat符号位扩展到long然后从long转到float关于符号位扩展shortdouble符号位扩展到long然后从long转到doubleshortlongdouble符号位扩展到long然后从long转到doublelongchar保留低位字节longshort保留低位字节longunsignedchar保留低位字节longunsignedshort保留低位字节longunsignedlong最高位失去符号位意义变为数据位longFloat使用单精度浮点数表示。可能丢失精度。longdouble使用双精度浮点数表示。可能丢失精度。longlongdouble使用双精度浮点数表示。可能丢失精度。无符号数的转换从到方法unsignedcharchar最高位作为符号位unsignedcharshort扩展unsignedcharlong扩展unsignedcharunsignedshort扩展unsignedcharunsignedlong扩展unsignedcharfloat转换到long再从long转换到floatunsignedchardouble转换到long再从long转换到doubleunsignedcharlongdouble转换到long再从long转换到doubleunsignedshortchar保留低位字节unsignedshortshort最高位作为符号位unsignedshortlong扩展unsignedshortunsignedchar保留低位字节unsignedshortunsignedlong扩展unsignedshortfloat转换到long再从long转换到floatunsignedshortdouble转换到long再从long转换到doubleunsignedshortlongdouble转换到long再从long转换到doubleunsignedlongchar保留低位字节unsignedlongshort保留低位字节unsignedlonglong最高位作为符号位unsignedlongunsignedchar保留低位字节unsignedlongunsignedshort保留低位字节关于符号位扩展unsignedlongfloat转换到long再从long转换到floatunsignedlongdoubleConvertdirectlytodoubleunsignedlonglongdouble转换到long再从long转换到double,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,符号扩展零扩展以及缩减数现代高级程序设计语言允许程序员使用包含不同大小的整数对象的表达式。那么当一个表达式的两个操作数大小不同的时候会发生什么呢,有些语言会报错而其他的语言则会自动将操作数转换成一个统一的格式。这种转换是有代价的因此如果你不希望编译器在你不知情的情况下自动加入各种转换到你原本非常完美的代码中就需要掌握编译器是如何处理这些表达式的。进制补码系统中同一个负数在不同大小的表示法中的表示是不同的。你不能在一个包含位数的表达式中随意地使用位有符号数转换是必需的。这种转换以及其逆操作(将位数转换为位)就是符号扩展(signextension)与缩减(contraction)操作。为例其位的二进制补码表示是$C而等效的位二进制补码表示则是$FFC。很显然其位模式不一样。再看看数其位和位表示分别是$与$。一个很显然的事实就是扩展负数的大小与扩展非负数的大小是完全不同的。个数从某个位数符号扩展到一个更大的位数很简单只需要将符号位复制到新格式新增的高端各位即可例如为了将一个位的数符号扩展到位只需将位数的第位复制到位数的第位即可。而将一个位数符号扩展到一个双字只需要将第位复制到双字的第位即可。处理不同长度有符号数的时候必须使用符号扩展。例如在将一个字节量与一个字量相加的时候在相加之前必须将字节量符号扩展到位。其他运算可能又会需要符号扩展到位。表符号扩展举例位位位二进制补码表示$$FF$FFFFFF$$$$A$FFA$FFFFFFA$F$F$Fna$$na$$FFFF处理无符号二进制数的时候可以使用零扩展(zeroextension)来将小位数的无符号数扩展到大位数的无符号数。零扩展非常简单只需要用零来填充大位数操作数的高端各个关于符号位扩展字节即可。例如为了将位数$零扩展到位只需要在高端字节中插入零即得到$。表零扩展举例位位位二进制补码表示$$$$$$$A$A$A$F$F$Fna$$na$$大多数高级语言编译器会自动处理符号扩展与零扩展以下C语言的例子说明了它们是如何工作的:signedcharsbyteC语言中的字符类型是一个字节shortintswordC语言中的短整型一般是位longintsdwordC语言中的长整型一般是位sword=sbyte自动将位值符号扩展到位sdword=sbyte自动将位值符号扩展到位sdword=sword自动将位值符号扩展到位语言(例如Ada)在从小数据类型转换到大数据类型时需要显式转换(explicitcast)。查一下所用语言的参考手册就知道这种显式转换是不是必需的了。要求提供显式转换的语言的优点在于编译器永远不会在程序员不知情的情况下做任何事情。如果你没有提供必要的转换编译器会给出一个诊断消息让你知道程序还需要改进。符号扩展和零扩展有一点需要明确的是它们是需要付出代价的。将一个小整型赋值给一个大整型可能会比在同样大小的整型变量间传输数据需要更多的机器指令(执行时间更长)。因此在一个数学表达式或者一条赋值语句中混合使用不同大小的变量要小心。符号缩减即将一个某位数转换为值相同但位数变小的数比较麻烦。符号扩展永远不会失败使用符号扩展一个m位有符号数永远可以转换为一个n位数(这里n>m)。不幸的是在m<n的情况下一个n位数不是总能转换为m位数。例如的位十六进制表示是$FE而这个数的大小对于位来说太大了我们无法将其符号缩减到位。将一个数值正确地符号缩减必须要检查需要丢弃的高端字节。首先这些高端字节必须是全零或者$FF如果它们包含其他值我们就无法对这个数进行符号缩减。其次最终结果的最高位必须与被丢弃的所有位一致。以下就是一些从位数转换到位数的例子:$FF()可以被符号缩减为$()$()可以被符号缩减为$()关于符号位扩展$FE()不能被符号缩减为位$()不能被符号缩减为位级语言里使用缩减有点困难有些语言譬如说C语言会直接将表达式的低端部分存储到比较小的变量中并将高端部分丢弃(在最好的情况下C编译器可能会在编译过程中给出一个警告提示可能会出现的精度损失)。你可以采取措施来让编译器停止抱怨但是它仍然不会检查数值的有效性。以下是C语言中符号缩减的典型代码:signedcharsbyteC语言中的字符类型是一个字节shortintswordC语言中的短整型一般是位longintsdwordC语言中的长整型一般是位sbyte=(signedchar)swordsbyte=(signedchar)sdwordsword=(shortint)sdword语言中唯一安全的解决方案就是在将表达式的结果值存储到一个小变量中之前将该结果值与某个上下边界值进行比较。不幸的是如果需要经常做这种操作代码会变得比较笨拙。以下就是加上这些检查之后的转换代码:if(sword>=sword<=){sbyte=(signedchar)sword}else{报告错误}另一种方案使用断言:assert(sword>=sword<=)sbyte=(signedchar)swordassert(sdword>=sdword<=)sword=(shortint)sdword易见这让代码变得丑陋。在CC中你可能会倾向于将它们编写为宏(#define)或者函数以提高代码的可读性。有些高级语言(例如Pascal和DelphiKylix)会自动进行符号缩减还会检查结果来确保它适用于目标操作。这些语言在越界违例发生的时候会产生某种类型的异常(或者停止程序的运行)。当然了如果你想加入纠错代码要么就需要写点异常处理代码要么就使用前面C语言例子中使用的if语句序列。

用户评论(0)

0/200

精彩专题

上传我的资料

每篇奖励 +2积分

资料评价:

/8
0下载券 下载 加入VIP, 送下载券

意见
反馈

立即扫码关注

爱问共享资料微信公众号

返回
顶部