《深入理解C++11:C++ 11新特性解析与应用》——2.3 扩展的整型

2.3 扩展的整型

类别:部分人

程序员常会在代码中发现一些整型的名字,比如UINT、__int16、u64、int64_t,等等。这些类型有的源自编译器的自行扩展,有的则是来自某些编程环境(比如工作在Linux内核代码中),不一而足。而事实上,在C++11中一共只定义了以下5种标准的有符号整型:

image

标准同时规定,每一种有符号整型都有一种对应的无符号整数版本,且有符号整型与其对应的无符号整型具有相同的存储空间大小。比如与signed int对应的无符号版本的整型是unsigned int。

在实际的编程中,由于这5种基本的整型适用性有限,所以有时编译器出于需要,也会自行扩展一些整型。在C++11中,标准对这样的扩展做出了一些规定。具体地讲,除了标准整型(standard integer type)之外,C++11标准允许编译器扩展自有的所谓扩展整型(extended integer type)。这些扩展整型的长度(占用内存的位数)可以比最长的标准整型(long long int,通常是一个64位长度的数据)还长,也可以介于两个标准整数的位数之间。比如在128位的架构上,编译器可以定义一个扩展整型来对应128位的的整数;而在一些嵌入式平台上,也可能需要扩展出48位的整型;不过C++11标准并没有对扩展出的类型的名称有任何的规定或建议,只是对扩展整型的使用规则做出了一定的限制。

简单地说,C++11规定,扩展的整型必须和标准类型一样,有符号类型和无符号类型占用同样大小的内存空间。而由于C/C++是一种弱类型语言,当运算、传参等类型不匹配的时候,整型间会发生隐式的转换,这种过程通常被称为整型的提升(Integral promotion)。比如如下表达式:

(int) a + (long long)b

通常就会导致变量(int)a被提升为long long类型后才与(long long)b进行运算。而无论是扩展的整型还是标准的整型,其转化的规则会由它们的“等级”(rank)决定。而通常情况,我们认为有如下原则:

image
image

而在进行隐式的整型转换的时候,一般是按照低等级整型转换为高等级整型,有符号的转换为无符号。这种规则其实跟C++98的整型转换规则是一致的。

在这样的规则支持下,如果编译器定义一些自有的整型,即使这样自定义的整型由于名称并没有被标准收入,因而可移植性并不能得到保证,但至少编译器开发者和程序员不用担心自定义的扩展整型与标准整型间在使用规则上(尤其是整型提升)存在着不同的认识了。

比如在一个128位的构架上,编译器可以定义_int128_t为128位的有符号整型(对应的无符号类型为_uint128_t)。于是程序员可以使用_int128_t类型保存形如+92233720368547758070的超长整数(长于64位的自然数)。而不用查看编译器文档我们也会知道,一旦遇到整型提升,按照上面的规则,比如_int128_t a,与任何短于它的类型的数据b进行运算(比如加法)时,都会导致b被隐式地转换为_int128_t的整型,因为扩展的整型必须遵守C++11的规范。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
相比其他语言的频繁更,C++语言标准已经有十多年没有真正更过了。而上一次 标准制定,正是面向对象概念开始盛行的时候。较之基于过程的编程语言,基于面向对 象、泛编程等概念的C++无疑是非常先进的,而C++98标准的制定以及各种符合标准的 编译器的出现,又在客观上推动了编程方法的革命。因此在接下来的很多年中,似乎人人 都在学习并使用C++。商业公司在邀请C++专家为程序员讲课,学校里老师在为学生绘声 绘色地讲解面向对象编程,C++的书籍市场也是百花齐放,论坛、BBS的C++板块则充斥 了大量各种关于C++的讨论。随之而来的,招聘启事写着“要求熟悉C++编程”,派生与继 承成为了面试官审视毕业生基础知识的重点。凡此种种,不一而足。于是C++语言“病毒 性”地蔓延到各种编程环境,成为了使用最为广泛的编程语言之一。 十来年的时光转瞬飞逝,各种编程语言也在快马加鞭地向前发展。如今流行的编程语 言几乎无一不支持面向对象的概念。即使是古老的语言,也通过了制定标准,开始支持 面向对象编程。随着Web开发、移动开发逐渐盛行,一些流行起来的编程语言,由于在 应用的快速开发、调试、部署上有着独特的优势,逐渐成为了这些领域中的主流。不过 这并不意味着C++正在失去其阵地。身为C的“后裔”,C++继承了C能够进行底层操作的特 性,因此,使用C/C++编写的程序往往具有更佳的运行时性能。在构建包括操作系统的各 种软件层,以及构建一些对性能要求较高的应用程序时,C/C++往往是最佳选择。更一般 地讲,即使是由其他语言编写的程序,往往也离不开由C/C++编写的编译器、运行库、操 作系统,或者虚拟机等提供支持。因此,C++已然成为了编程技术中的中流砥柱。如果用 个比喻来形容C++,那么可以说这十来年C++正是由“锋芒毕露”的青年时期走向“成熟稳 重”的中年时期。 不过十来年对于编程语言来说也是个很长的时间,长时间的沉寂甚至会让有的人认 为,C++就是这样一种语言:特性稳定,性能出色,易于学习而难于精通。长时间使用 C++的程序员也都熟悉了C++毛孔里每一个特性,甚至是现实上的一些细微的区别,比如 各种编译器对C++扩展的区别,也都熟稔于心。于是这个时候,C++11标准的横空出世, 以及C++之父Bjarne Stroustrup的一句“看起来像一门语言”的说法,无疑让很多C++程序 员有些诚惶诚恐:C++11是否又带来了编程思维的革命?C++11是否保持了对C++98及C 的兼容?旧有的C++程序到了C++11是否需要被推倒重来? 事实上这些担心都是多余的。相比于C++98带来的面向对象的革命性,C++11带来的 却并非“翻天覆地”式的改变。很多时候,程序员保持着“C++98式”的观点来看待C++11代 码也同样是合理的。因为在编程思想上,C++11依然遵从了一贯的面向对象的思想,并深 入加强了泛编程的支持。从我们的观察来看,C++11更多的是对步入“成熟稳重”的中年 时期的C++的一种改造。比如,像auto类推导这样的特性,展现出的是语言的亲和 力;而右值引用、移动语义的特性,则着重于改变一些使用C++程序库时容易发生的性能 不佳的状况。当然,C++11中也有局部的创,比如lambda函数的引入,以及原子类的 设计等,都体现了语言与时俱进的活力。语言的诸多方面都在C++11中再次被锤炼,从而 变得更加合理、更加条理清晰、更加易用。C++11对C++语言改进的每一点,都呈现出了 经过长时间技术沉淀的编程语言的特色与风采。所以从这个角度上看,学习C++11与 C++98在思想上是一脉相承的,程序员可以用较小的代价对C++的知识进行更换代。而 在现实中,只要修改少量已有代码(甚至不修改),就可以使用C++11编译器对旧有代码 进行升级编译而获得标准带来的好处,这也非常具有实用性。因此,从很多方面来看, C++程序员都应该乐于升级换代已有的知识,而学习及使用C++11也正是大势所趋。 在本书开始编写的时候,C++11标准刚刚发布一年,而本书出版的时候,C++11也只 不过才诞生了两年。这一两年,各个编译器厂商或者组织都将支持C++11特性作为了一 项重要工作。不过由于C++11的语言特性非常的多,因此本书在接近完成时,依然没有一 款编译器支持C++11所有的特性。但从从业者的角度看,C++11迟早会普及,也迟早会 成为C++程序员的首选,因此即使现阶段编译器对C++特性的支持还不充分,但还是有 必要在这个时机推出一本全面介绍C++11特性的中文图书。希望通过这样的图书,使得 更多的中国程序员能够最快地了解C++11语言标准的方方面面,并且使用最的C++11 编译器来从各方面提升自己编写的C++程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值