6.3.1 算术操作数

6.3.1.1 布尔、字符以及整数

1、每个整数类型具有一个整数转换等级,如下定义:

——两个带符号的整数类型都不应该具有相同等级,即使它们具有相同的表示。

——一个带符号整数类型的等级应该比任一具有更低精度的带符号整数类型的等级要高。

——long long int的等级应该比long int的等级要高,而long int等级要比int等级要高,int要比short int等级要高,而short int要比signed char等级要高。

——任一无符号整数类型的等级应该等于相应的带符号整数类型,如果存在的话。

——任一标准整数类型的等级应该大于任一具有相同宽度的扩展整数类型的等级。

——char的等级应该等于signed charunsigned char的等级。

——_Bool的等级应该小于所有其它标准整数类型的等级。

——任一枚举类型的等级应该等于相兼容整数类型的等级(见6.7.2.2)。

——任一扩展带符号整数类型相对于具有相同精度的另一个扩展带符号整数类型的等级是由实现定义的,但仍然遵从判定整数转换等级的其它规则。

——对于所有整数类型T1T2T3,如果T1具有比T2更高等级,且T2具有比T3更高的等级,那么T1T3更高等级。

2、以下规则可以被用于intunsigned int可以被使用的一个表达式中:

——具有一个整数类型的一个对象或表达式(除了intunsigned int之外),其整数转换等级小于等于intunsigned int的等级。

——类型_Boolintsigned intunsigned int的一个位域。

如果一个int可以表示原始类型的所有值(对于一个位域,由宽度所限定),那么该值被转换为一个int;否则,它被转换为一个unsigned int。这些被称为整数晋升。[注:整数晋升仅应用于:作为通常的算术转换的一部分,到某些实参表达式,到单目操作符+-~的操作数,以及移位操作符的两个操作数,通过它们相关的子条款指定。]所有其它类型不会被整数晋升所改变。

3、整数晋升保留了值,包括符号。正如之前所讨论的,一个“平凡的”char是否被看作为带符号还是无符号是实现定义的。

6.3.1.2 布尔类型

1、当任一标量值被转换为_Bool时,结果为0,如果该值与0比较相等;否则,结果为1。[注:非数NaN与0比较不为0,从而被转换为1。]

6.3.1.3 带符号与无符号整数

1、当具有整数类型的一个值被转换为另一个不为_Bool的整数类型时,如果该值可以用新的类型表示,那么该值不被改变。

2、否则,如果新的类型是无符号的,那么该值通过重复地加或减能在新的类型中可被表示的最大值加1,直到该值在新类型的范围内。[注:此规则描述了数学值上的算术计算,而不是一个给定类型的表达式的值]。[译者注:比如以下代码:

unsigned short a = ;
unsigned char b = (unsigned char)a;
// b == 258 - 256 = 2

上述代码中,a为无符号短整型,它被转换为无符号char类型时通过减一次能用unsigned char所表示的最大值(255)加1来得到类型转换后的值,并存在b变量中。

3、否则,新的类型是带符号的并且该值不能用它来表示;结果可以是实现定义的,也可以引发实现定义的信号。

6.3.1.4 实浮点数与整数

1、当实浮点类型的一个有限值被转为除_Bool以外的一个整数类型时,尾数部分被丢弃(即,该值向零截断)。如果整数部分的值不能用整数类型来表示,那么行为是未定义的。[注:当整数类型的一个值被转为无符号类型时所执行的求余操作,当实浮点类型的一个值被转为无符号类型时不需要被执行。从而,可转换的实浮点值的范围是(-1, U类型_MAX + 1)。]

2、当一个整数类型的值被转换为一个实浮点类型时,如果正被转换的值可以完全用该新类型来表示,那么它的值不会被改变。如果正在被转换的值在可被表示的值的范围内,但不能被完全表示,那么结果要么为最近最大的,要么为最近最小可表示的值,此选择为实现定义的行为。如果正在被转换的值在可被表示的范围之外,那么行为是未定义的。某些隐式转换可以在更大范围和精度内被表示,比起由新类型所能所需要的范围和精度(见6.3.1.8和6.8.6.4)。

6.3.1.5 实浮点类型

1、当实浮点数类型的一个值被转为一个实浮点类型时,如果正被转换的值可以完全用该新类型来表示,那么该值是不改变的。如果正被转换的值在能被表示的值的范围内,但不能完全被表示,那么结果要么为最近更大,要么为最近更小的值,此选择是一个实现定义的行为。如果正被转换的值在能被表示的范围外,那么该行为是未定义的。某些隐式转换的结果可以用更大范围和精度来表示,比起用新的类型所要求的范围和精度(见6.3.1.8和6.8.6.4)。

6.3.1.6 复数类型

1、当复数类型的一个值被转换为另一个复数类型,实数与虚数部分都遵循相应的实数类型的转换规则。

6.3.1.7 实数与复数

1、当一个实数类型的值被转换为一个复数类型时,该复数结果值的实数部分由相应于复数结果值的实数类型决定,并且虚数类型部分结果值是一个正零或一个无符号的零。

2、当一个复数类型的值被转换为一个实数类型时,复数值的虚数部分被丢弃,并且实数部分的值根据相应实数类型的转换规则进行转换。

6.3.1.8 通常的算术转换

1、许多期待算术类型操作数的操作符引发转换并以一种类似的方式产生结果类型。目的是为了确定操作数与结果的公共实数类型。对于指定的操作数,每个操组数被转换到一个类型,其相应的实数类型是公共实数类型,而不改变类型域。除非显式地阐明,否则公共的实数类型也是结果相应的结果类型,该结果的类型域为操作数的类型域,如果它们都相同的话,否则为复数。该模式被称为通常的算术转换

首先,其中一个操作数的相应实数类型为long double,而另一个操作数被转换为一个类型,其相应的实数类型为long double,而不改变类型域。

否则,如果其中一个操作数的相应实数类型是double,另一个操作数被转换为一个类型,其相应的实数类型为double,而不改变类型域。

否则,如果其中一个操作数的相应实数类型为float,而另一个操作数被转换为一个类型,其相应的实数类型是float,而不改变类型域。[注:比如,double _Complex与一个float的加法使得float操作数到double的转换变为有所必要(并产生一个double _Complex结果)。]

否则,对两个操作数都执行整数晋升。然后对晋升的操作数应用以下规则:

如果两个操作数都具有相同类型,那么不需要进一步的转换。

否则,如果两个操作数都具有带符号类型或无符号类型,那么具有更小整数转换等级类型的操作数被转换为具有更大整数转换等级的操作数类型。

否则,如果具有无符号整数类型的操作数所具有的等级大于等于另一个操作数类型的等级,那么具有带符号整数类型的操作数被转换为具有无符号整数类型的操作数类型。

否则,如果具有带符号整数类型的操作数类型可以表示具有无符号整数类型的操作数类型的所有的值,那么无符号整数类型的操作数被转换为带有带符号整数类型的操作数类型。

否则,两个操作数都被转换为相应于具有带符号整数类型的操作数类型的无符号整数类型。

2、浮点操作数的值与浮点表达式结果的值可以用更大范围和精度来表示,比起该类型所需要的范围和精度;该类型从而不被改变。[注:但仍然要求投射与赋值操作符移除额外的范围和精度。]

ISO/IEC 9899:2011 条款6.3.1——算术操作数的更多相关文章

  1. ISO/IEC 9899:2011 条款6.3.2——其它操作数

    6.3.2 其它操作数 6.3.2.1 左值,数组,与函数指派符 1.一个左值是潜在地指派一个对象的一个表达式(具有一个对象类型,而不是void):[注:名字“左值”源自于赋值表达式E1 = E2,在 ...

  2. ISO/IEC 9899:2011 条款3——术语、定义与符号

    3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...

  3. ISO/IEC 9899:2011 条款5——5.2.1 字符集

    5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...

  4. ISO/IEC 9899:2011 条款6.4.2——标识符

    6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier    identifier-nondigit identifie ...

  5. ISO/IEC 9899:2011 条款6.4.3——通用字符名

    6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...

  6. ISO/IEC 9899:2011 条款6.3——转换

    6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...

  7. ISO/IEC 9899:2011 条款5——5.2.4 环境限制

    5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执 ...

  8. ISO/IEC 9899:2011 条款5——5.1.2 执行环境

    5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...

  9. ISO/IEC 9899:2011 条款4——标准顺从

    4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...

随机推荐

  1. asp.net 页面按回车就会触发button按钮事件

    转载于 https://www.cnblogs.com/anz130/articles/2445830.html 转自:http://space.itpub.net/12639172/viewspac ...

  2. zookeeper学习(3)----基本结构和命令行操作命令

    一. 数据结构 https://www.jianshu.com/p/8e322462bcca zookeeper存储结构:以树形结构的方式存储数据 ZooKeeper数据模型的结构整体上可以看作是一棵 ...

  3. LeetCode 269. Alien Dictionary

    原题链接在这里:https://leetcode.com/problems/alien-dictionary/ 题目: There is a new alien language which uses ...

  4. P3588 [POI2015]PUS

    好题 思路:线段树优化建图+拓扑DP or 差分约束(都差不多): 提交:3次 错因:眼瞎没看题,Inf写的0x3f3f3f3f 题解: 类似差分约束的模型,\(a<b\rightarrow a ...

  5. iwap问题

    1. 2. . . ========================================================================================== ...

  6. vue自定义弹框

    vue 全局自定义简单弹框 https://www.jianshu.com/p/1307329aa09e https://www.cnblogs.com/crazycode2/p/7907905.ht ...

  7. P5431 【模板】乘法逆元2

    洛谷题目链接 刚开始做乘法逆元还是有点懵逼的~ 以下式子都在模\(p\)意义下进行 我们把式子改一下,变成:\[\sum\limits_{i=1}^nk^i\times a_i^{-1}\] 我们先算 ...

  8. 关于 requestAnimationFrame 小结

    一.小谈 requestAnimationFrame: 说起 requestAnimationFrame,我们先看幅图: 相当一部分的浏览器的显示频率是16.7ms, 就是上图第一行的节奏,表现就是“ ...

  9. 解决vue多个路由共用一个页面的问题

    在日常的vue开发中我们可能会遇见多个路由需要共用一个页面的需求,特别是当路由是通过动态添加的,不同的路由展示的东西只是数据不同其他没有变化.例如: ? 1 2 3 4 5 6 7 8 9 10 11 ...

  10. dbcp_c3p0连接mysql8.0.13

    背景 学习数据库的使用,上次没有记录,现在都回忆不起来了,所以这次重新学的时候顺便记录下. 配置环境 win10 jdk11 idea mysql8.0.13 DBCP连接使用 用配置文件目前我连接不 ...