保健励志美文体育育儿作文
投稿投诉
作文动态
热点娱乐
育儿情感
教程科技
体育养生
教案探索
美文旅游
财经日志
励志范文
论文时尚
保健游戏
护肤业界

C宽窄基本类型转换和父类子类转换

  基本数据类型有不同的编码方案(encodingscheme),需要不同的字节长度来适应各自的值域。
  基本类型的宽窄转换,是一个整体的转换,其由窄到宽是安全的,由宽到窄可能会丢失数据。
  继承链上父类子类转换,不单只是数据域的宽窄问题,还有不同数量的成员函数去访问数据的问题。1基本类型的转换
  C虽然是强类型语言,但支持类型的隐式转换和显式转换。类型转换不仅发生在表达式中,还发生在函数调用时的实参与形参结合时,以及函数返回值时。
  1。1基本类型由窄到宽,其隐式转换为安全的charch3;intnch;doublefn;
  1。2类型提升
  表达式(右式)中不同类型参与运算时,会有一个类型提升的问题(避免数据丢失),如整型提升到最大宽度的类型,有符号提升到无符号,单精度提升到双精度等。unsignedchara0xa5;unsignedcharba41;printf(d,b);250不考虑类型提升考虑类型提升10100101000000000000000000000000000000001010010101011010111111111111111111111111111010110100000001011111010Theimplicitconversionsthatpreservevaluesarecommonlyreferredtoaspromotions。Beforeanarithmeticoperationisperformed,integralpromotionisusedtocreateintsoutofshorterintegertypes。Thisreflectstheoriginalpurposeofthesepromotions:tobringoperandstothenaturalsizeforarithmeticoperations。Inaddition,floattodoubleisconsideredapromotion。
  保存值的隐式转换通常称为提升。在执行算术运算之前,整数提升用于从较短的整数类型中创建整数(ints)。这反映了这些提升的最初目的:将操作数调整为算术运算的自然大小(sizeof(int))。此外,float到double被认为是一种提升。
  1。3基本类型由宽到窄(narrowingconversions)
  InC,anarrowingconversionisanumericconversionthatmayresultinthelossofdata。Suchnarrowingconversionsinclude:
  在C中,窄向转换是一种可能导致数据丢失的数字转换。此类窄向转换包括:
  Fromafloatingpointtypetoanintegraltype。
  从浮点类型到整数类型。
  Fromawiderfloatingpointtypetoanarrowerfloatingpointtype,unlessthevaluebeingconvertedisconstexprandisinrangeofthedestinationtype(evenifthenarrowertypedoesn’thavetheprecisiontostorethewholenumber)。
  从较宽的浮点类型到较窄的浮点类型,除非转换的值是constexpr并且在目标类型的范围内(即使较窄的类型没有存储整数的精度)。
  Fromanintegraltoafloatingpointtype,unlessthevaluebeingconvertedisconstexprandisinrangeofthedestinationtypeandcanbeconvertedbackintotheoriginaltypewithoutdataloss。
  从整数类型转换为浮点类型,除非转换的值是constexpr,并且在目标类型的范围内,并且可以在不丢失数据的情况下转换回原始类型。
  Fromawiderintegraltypetoanarrowerintegraltype,unlessthevaluebeingconvertedisconstexprandafterintegralpromotionwillfitintothedestinationtype。
  从较宽的整数类型转换为较窄的整数类型,除非转换的值是constexpr,并且整数升级后将适合目标类型。
  Thegoodnewsisthatyoudon’tneedtorememberthese。Yourcompilerwillusuallyissueawarning(orerror)whenitdeterminesthatanimplicitnarrowingconversionisrequired。
  好消息是你不需要记住这些。当编译器确定需要窄向转换时,通常会发出警告(或错误)。
  Recommendtousingstaticcasttomakenarrowingconversionsexplicit。
  推荐使用staticcast显式进行窄向转换。
  Compilerswilloftenissuewarningswhenapotentiallyunsafe(narrowing)implicittypeconversionisperformed。Forexample,considerthefollowingprogram:
  当执行潜在的不安全(缩小范围)隐式类型转换时,编译器通常会发出警告。例如,考虑以下程序:inti{48};charchi;implicitnarrowingconversion
  Castinganint(2or4bytes)toachar(1byte)ispotentiallyunsafe(asthecompilercan’ttellwhethertheintegervaluewilloverflowtherangeofthecharornot),andsothecompilerwilltypicallyprintawarning。Ifweusedlistinitialization,thecompilerwouldyieldanerror。
  将int(2或4字节)转换为char(1字节)可能不安全(因为编译器无法判断整数值是否会溢出char的范围),因此编译器通常会打印警告。如果使用列表初始化,编译器将产生错误。
  Togetaroundthis,wecanuseastaticcasttoexplicitlyconvertourintegertoachar:
  为了解决这个问题,我们可以使用静态转换将整数显式转换为字符:inti{48};explicitconversionfrominttochar,sothatacharisassignedtovariablechcharch{staticcastchar(i)};
  Whenwedothis,we’reexplicitlytellingthecompilerthatthisconversionisintended,andweacceptresponsibilityfortheconsequences(e。g。overflowingtherangeofacharifthathappens)。Sincetheoutputofthisstaticcastisoftypechar,theinitializationofvariablechdoesn’tgenerateanytypemismatches,andhencenowarningsorerrors。
  当我们这样做的时候,我们明确地告诉编译器这个转换是有意的,并且我们承担后果的责任(例如,如果发生这种情况,就会溢出字符的范围)。由于此staticcast的输出是char类型,因此变量ch的初始化不会生成任何类型不匹配,因此不会产生警告或错误。
  1。3。1长整型转换为短整型:舍弃高位;
  1。3。2浮点型转换为整型:舍弃小数部分;
  1。3。3double转换为float:可能会有精度损失;includestdio。hintmain(){intn1027;0000000000000000010000000011charchn;00000011,ch与n的编码方式相同(补码),直接取sizeof(ch)个字节bereducedmodulo(theremainderofanintegerpisionbythe)char’srangeprintf(d,ch);3doublef3。75;11。11b,01000000011100000000000000000000指数100000001,尾数11nf;n与f的编码方式不同(补码与IEEE754浮点编码方案),按语言预定规则转换printf(d,n);3,弃掉小数部分inta1000;0000000000000000001111101000charba;bbecomes24(onsomemachines)取最后一个字节(小端存储则地址不变,取第一个字节),printf(d,b);111010001100024}adoubletointconversiontruncates(alwaysroundsdown,towardzero)ratherthanusingtheconventional45rounding。howconversionsfromdoubletointandconversionsfrominttochararedoneonyourmachine
  C11introducedaninitializationnotationthatoutlawsnarrowingconversions。
  C11引入了一种初始化符号,禁止窄向转换。
  Forexample,wecould(andshould)rewritethetroublesomeexamplesaboveusinga{}listnotation,ratherthanthenotation:
  例如,我们可以(而且应该)使用{}list表示法而不是表示法重写上述麻烦的示例:doublex{2。7};OKinty{x};error:doubleintmightnarrowinta{1000};OKcharb{a};error:intcharmightnarrowintcharb1{1000};error:narrowing(assuming8bitchars)charb2{48};OK
  Wecanusenarrowcastwhenweneedtoconvertavalueandwearenotsureifitwillfit;itisdefinedinstdlibfacilities。handimplementedusingerror()。narrowcastcanthrowaruntimeerrorexception:
  当我们需要转换一个值并且我们不确定它是否合适时,我们可以使用narrowcast;它在stdlibfacilities。h中定义,并使用error()实现。narrowcast可以引发runtimeerror异常:intx1narrowcastint(2。9);throwsintx2narrowcastint(2。0);OKcharc1narrowcastchar(1066);throwscharc2narrowcastchar(85);OK2继承链上父类子类转换
  子类对象父类对象,子可能有更多成员,可能存在越界;
  父类对象子类对象,父可能只有更少空间,存在切割;
  父类指针或引用子类指针或引用,不存在切割,且是多态的必备条件。
  派生类中的成员,包含两大部分,一类是从基类继承过来的,一类是自己增加的成员。
  从基类继承过来的表现其共性,而新增的成员体现了其个性。
  code:includeiostreamincludestringusingnamespacestd;classStudent{public:Student(stringsn,intn,chars);Student();voiddis();private:stringname;intnum;charsex;};Student::Student(stringsn,intn,chars):name(sn),num(n),sex(s){}Student::Student(){}voidStudent::dis(){coutnameendl;coutnumendl;coutsexendl;}classGraduate:publicStudent{public:Graduate(stringsn,intin,charcs,floatfs);Graduate();voiddump(){dis();coutsalaryendl;}private:floatsalary;};Graduate::Graduate(stringsn,intin,charcs,floatfs):Student(sn,in,cs),salary(fs){}Graduate::Graduate(){}classBirthday{public:Birthday(inty,intm,intd);Birthday();voidprint();private:intyear;intmonth;intday;};Birthday::Birthday(inty,intm,intd):year(y),month(m),day(d){}Birthday::Birthday(){}voidBirthday::print(){coutyearmonthdayendl;}classDoctor:publicGraduate{public:Doctor(stringsn,intin,charcs,floatfs,stringst,intiy,intim,intid);Doctor();voiddisdump();private:stringtitle;调用的默认构造器,初始化为Birthdaybirth;类中声明的类对象};Doctor::Doctor(stringsn,intin,charcs,floatfs,stringst,intiy,intim,intid):Graduate(sn,in,cs,fs),birth(iy,im,id),title(st){}Doctor::Doctor(){}voidDoctor::disdump(){dump();couttitleendl;birth。print();}intmain(){Students(zhaosi,2001,m);s。dis();coutendl;Graduateg(liuneng,2001,x,2000);g。dump();coutendl;Doctord(qiuxiang,2001,y,3000,doctor,2001,8,16);d。disdump();getchar();return0;}zhaosi2001mliuneng2001x2000qiuxiang2001y3000doctor2001816
  Asyouhavealreadyseen,anobjectcanbecastorassignedtoitsparentclass。Ifthecastorassignmentisperformedonaplainoldobject,thisresultsinslicing:
  正如您已经看到的,可以强制转换对象或将其指定给其父类。如果在普通旧对象上执行强制转换或指定,则会导致切片:BasemyBasemyDerived;Slicing!
  SlicingoccursinsituationslikethisbecausetheendresultisaBaseobject,andBaseobjectslacktheadditionalfunctionalitydefinedintheDerivedclass。However,slicingdoesnotoccurifaderivedclassisassignedtoapointerorreferencetoitsbaseclass:
  切片发生在这样的情况下,因为最终结果是一个基对象,而基对象缺少派生类中定义的其他功能。但是,如果将派生类分配给指针或对其基类的引用,则不会发生切片:BasemyBasemyDerived;Noslicing!
  Thisisgenerallythecorrectwaytorefertoaderivedclassintermsofitsbaseclass,alsocalledupcasting。Thisiswhyit’salwaysagoodideatomakeyourmethodsandfunctionstakereferencestoclassesinsteadofdirectlyusingobjectsofthoseclasses。Byusingreferences,derivedclassescanbepassedinwithoutslicing。
  这通常是根据派生类的基类(也称为向上转换)引用派生类的正确方法。这就是为什么让方法和函数引用类而不是直接使用这些类的对象总是一个好主意。通过使用引用,可以传入派生类而无需切片。
  Castingfromabaseclasstooneofitsderivedclasses,alsocalleddowncasting,isoftenfrowneduponbyprofessionalCprogrammersbecausethereisnoguaranteethattheobjectreallybelongstothatderivedclass,andbecausedowncastingisasignofbaddesign。Forexample,considerthefollowingcode:
  从基类到其派生类之一的强制转换(也称为向下转换)通常受到专业C程序员的反对,因为无法保证对象确实属于该派生类,而且向下转换是糟糕设计的标志。例如,考虑以下代码:voidpresumptuous(Basebase){DerivedmyDerivedstaticcastDerived(base);ProceedtoaccessDerivedmethodsonmyDerived。}
  Iftheauthorofpresumptuous()alsowritescodethatcallspresumptuous(),everythingwillprobablybeokaybecausetheauthorknowsthatthefunctionexpectstheargumenttobeoftypeDerived。However,ifotherprogrammerscallpresumptuous(),theymightpassinaBase。Therearenocompiletimechecksthatcanbedonetoenforcethetypeoftheargument,andthefunctionblindlyassumesthatbaseisactuallyapointertoaDerived。
  如果presumptuous()的作者还编写了调用presumptuous()的代码,那么一切都可能正常,因为作者知道函数期望参数的类型是派生的。然而,如果其他程序员调用presumptuous(),他们可能会传入一个Base。没有可以执行的编译时检查来强制参数的类型,并且函数盲目地假设base实际上是指向派生类型的指针。
  Downcastingissometimesnecessary,andyoucanuseiteffectivelyincontrolledcircumstances。However,ifyouaregoingtodowncast,youshoulduseadynamiccast(),whichusestheobject’sbuiltinknowledgeofitstypetorefuseacastthatdoesn’tmakesense。Thisbuiltinknowledgetypicallyresidesinthevtable,whichmeansthatdynamiccast()worksonlyforobjectswithavtable,thatis,objectswithatleastonevirtualmember。Ifadynamiccast()failsonapointer,thepointer’svaluewillbenullptrinsteadofpointingtononsensicaldata。Ifadynamiccast()failsonanobjectreference,anstd::badcastexceptionwillbethrown。
  向下转型有时是必要的,您可以在受控环境中有效地使用它。但是,如果要向下转型,则应使用dynamiccast(),它使用对象的内置类型知识来拒绝没有意义的转换。这种内置知识通常驻留在vtable中,这意味着dynamiccast()仅适用于具有vtable的对象,即至少具有一个虚拟成员的对象。如果指针上的dynamiccast()失败,指针的值将为nullptr,而不是指向无意义的数据。如果对象引用上的动态dynamiccast()失败,将引发std::badcast异常。
  Thepreviousexamplecouldhavebeenwrittenasfollows:
  前面的示例可以编写如下:voidlessPresumptuous(Basebase){DerivedmyDeriveddynamiccastDerived(base);if(myDerived!nullptr){ProceedtoaccessDerivedmethodsonmyDerived。}}
  Theuseofdowncastingisoftenasignofabaddesign。Youshouldrethinkandmodifyyourdesignsothatdowncastingcanbeavoided。Forexample,thelessPresumptuous()functiononlyreallyworkswithDerivedobjects,soinsteadofacceptingaBasepointer,itshouldsimplyacceptaDerivedpointer。Thiseliminatestheneedforanydowncasting。Ifthefunctionshouldworkwithdifferentderivedclasses,allinheritingfromBase,thenlookforasolutionthatusespolymorphism。
  使用向下转型通常是糟糕设计的标志。您应该重新考虑和修改您的设计,以避免向下转型。例如,lessPresumptuous()函数实际上只适用于派生对象,因此它不应该接受基指针,而应该只接受派生指针。这消除了任何向下转型的需要。如果函数应该使用不同的派生类,所有派生类都是从基继承的,那么请寻找使用多态性的解决方案。
  ref
  https:www。learncpp。comcpptutorialnumericconversions
  MarcGregoire《PROFESSIONALC》(比)格莱戈尔《C高级编程》
  End

我爱三国演义小学作文我爱《三国演义》书,是快乐日子里的一把吉他,尽情为你弹奏生活的愉悦;书,是忧伤日子里的一股春风,轻轻地为你拂去心中的愁云;书,是人生道路的一盏明灯,默默地为你驱赶心中的阴……羡慕了!这家A股公司给每个员工发一部iPhone13,公司已又有A股公司给员工发福利,而且还是每人发放一部iPhone13!据蓝鲸财经报道,6月1日,方大特钢举行2022年员工手机福利发放仪式,该公司自2017年以来连续六次给员工……武术精神作文精选武术是艺术的高标,它,是美的雅号,它是中华的骄傲。今天,语文迷小编为大家提供两篇武术精神作文,欢迎借鉴参考!武术精神作文【1】武,不只是为武一个,那个派头,而是去武……清洁空气蓝天行动我们是地球上最聪慧的生物,我们主宰着这个已有几十亿年历史的地球。而我们却总是忘记,我们对于地球来说是微不足道的,我们不断从地球中索取,我们不断破坏地球,而这些行动的背后,隐藏着……关于我的自画像的作文范文我的自画像(1)有一个小男孩叫刘逸飞,上小学三年级了。今天我就给大家介绍一下他吧!他长着一双机灵的小眼睛,透着一股机灵劲儿,一个塌鼻子上驾着一副小眼镜。他还长着一对……小学作文多功能电话2020年,现在的电话骗子太多了。我多么想知道未来的电话是什么样子的,于是我请求q博士研究时光穿梭器,越快越好,三天后,q博士告诉我做好了。于是我穿梭到2050年,那时的我,已……富士康选择在马来西亚建立电动汽车芯片工厂富士康计划在鲜为人知的半导体中心马来西亚建厂,为不断扩大的电动汽车领域制造芯片。富士康的马来西亚合作伙伴DagangNeXchange在向马来西亚证券交易所提交的文件中表示,它……三年级关于菊花的作文导语:菊花不但美丽,而且还很香,哪里有它,哪里就有淡淡的香味。以下三年级关于菊花的作文由品学网小编最新整理收集,欢迎大家阅读!篇一:菊花到了秋天这金黄色的日子里,菊花尽情……三星GalaxyS23持续创新,2亿主摄沉浸式直屏,真香旗舰三星手机大家都不陌生,从功能机时代开始,三星就致力于手机市场,进入5G智能机时代后,三星再次发力,全球市场占有率遥遥领先。虽然因为爆炸事件导致近几年国内销量并不理想,但从全球市……华为机器视觉军团成立!任正非这样说2022年第一季度,对华为机器视觉来说,是内生力凝聚,厚积薄发的关键时刻。从今年年初开始,关于华为机器视觉的传闻、谣言就在业界四处飘散,各种声音千奇百怪,有的说华为机器视……618节日旗舰市场取得销量第一,vivoX80系列给你不一样一年一度的618购物节全面到来,许多用户选择在这个时间段进行换机,而各大厂商也在618活动期间带来更优惠的入手价格与更丰富的购机福利。在618的首日促销中,vivoX80系列便……2014年5月14日家长会今天,是上初中以来的第二次家长会mdash;mdash;和煦的阳光照在每位同学的身上,给人一种朦胧的美感,但就是这种温暖的夏日,让空气变得更加压抑,困倦不断袭来。当……
思乡情初中作文家乡,是一个对我而言不平凡的地方。当我变成天上的星星时,我仍会用我微弱的光来照耀那块土地。下面是小编整理了思乡情初中作文,希望对你有帮助!篇一:乡情记忆中我的故乡,很偏僻……腾讯最新财报来了,看完研发数据,网友感叹宁德时代真的尴尬了小米:你礼貌吗、怎么能这么瞧不起雷总近日,国金分析师怼宁德时代引发网友热议。有大V表示,宁德时代一年的研发投入连腾讯、阿里、百度、美团、小米都不如,却被当作资本市场的硬科……小学生描写我的妈妈的作文200字【关于描写妈妈的作文1】我的妈妈长的很平常,高鼻梁,大眼睛,个子很高。每天我妈妈起早贪黑的上班,我早上6点起床,我妈妈也是6点起床为我做早饭。晚上我回家做作业做到很晚,我……北京120小程序上线!后续将推出一键呼救视频报警等功能据北京急救中心发布,北京120手机客户端小程序日前上线,可向公众提供满意度回访、物价查询等功能。后续,小程序还会推出一键呼救、视频报警、费用支付、票据下载等功能。为满足首……小米12Ultra最快下周发布,首发高通骁龙8,能效暴增30众望所归的骁龙8正式发布,小米总裁王翔出席并官宣了小米将首发骁龙8芯片,雷军转发王翔讲话的截图,并且官宣小米全新旗舰即将搭载首发。小米与高通有着长达近12年的战友情,此次……腾讯起诉国产手机巨头,发生了什么?本文原创,禁止搬运和抄袭,违者必究!腾讯产品生态遍布互联网的各个角落,在各大互联网产业领域都能看见腾讯的身影。要么是腾讯直接参与的布局,要么是通过投资的方式成为幕后大佬。……五年级秋天的树作文秋,一个美丽的季节,它既带着丰收的幸福,又带着一丝怀念。树上已经变得斑驳,那一片片红、黄色的枯叶,像是一张张老照片,记载着一年的幸福与快乐。接下来是小编带来的五年级秋天的树作文……小不点蕾蕾在我们的人生道路上,曾经有许多人在我们童稚的心灵里留下了足迹。我也不例外,在我的心理,也有着一个令我难忘的人,她就是我的好朋友蕾蕾。蕾蕾长得很漂亮,梳着一头长长的头发,眼……门后,我的家小学作文雨,淅淅沥沥的下着,一切都沉浸在朦胧之中,宛如仙境。我不知道该如何面对余下的事这一次又考差了,在母亲的面前,又不知保证了多少次。抬起的手有些酸痛,站在门外已有多时了,我不敢敲门……唱响青春之歌放飞理想风筝初三作文青春,理想是多么诱人的字眼儿,又是联系多么紧密的词语啊!是啊,青春是实现理想的资本,而理想树立的最佳时期就是青春。有人说青春是一棵长青树,永不凋零;也有人说青春是划破天宇……妈妈的生日日记范文今天是一个重要的日子妈妈的生日。妈妈还是和往常一样,早早地出门工作了。我和弟弟妹妹开始为妈妈筹备生日。我们先去商店买一些所需的装饰品,去蛋糕店定一个大蛋糕,然后再去花店买……女人过了五十岁,烫头发要记牢这三不烫,拉低气质又容易显老对于50岁的女人来说,烫头发是一把双刃剑。烫出来的发型符合自己的五官脸型,可以提高自己的颜值与气质,获得时尚减龄的效果。如果卷型选择不当,发型又不适合自己的脸型,不仅会拉低你的……
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网