ISO/IEC 9899:2011 条款6.3.1——算术操作数
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 char与unsigned char的等级。
——_Bool的等级应该小于所有其它标准整数类型的等级。
——任一枚举类型的等级应该等于相兼容整数类型的等级(见6.7.2.2)。
——任一扩展带符号整数类型相对于具有相同精度的另一个扩展带符号整数类型的等级是由实现定义的,但仍然遵从判定整数转换等级的其它规则。
——对于所有整数类型T1、T2和T3,如果T1具有比T2更高等级,且T2具有比T3更高的等级,那么T1比T3更高等级。
2、以下规则可以被用于int或unsigned int可以被使用的一个表达式中:
——具有一个整数类型的一个对象或表达式(除了int或unsigned int之外),其整数转换等级小于等于int与unsigned int的等级。
——类型_Bool、int、signed int或unsigned 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——算术操作数的更多相关文章
- ISO/IEC 9899:2011 条款6.3.2——其它操作数
6.3.2 其它操作数 6.3.2.1 左值,数组,与函数指派符 1.一个左值是潜在地指派一个对象的一个表达式(具有一个对象类型,而不是void):[注:名字“左值”源自于赋值表达式E1 = E2,在 ...
- ISO/IEC 9899:2011 条款3——术语、定义与符号
3. 术语.定义与符号 1.对于此国际标准的意图,应用了以下定义.其它术语是在用斜体类型或一个语法规则左侧出现的地方定义.在本国际标准中所显式定义的术语不被假定为对其它地方所定义的类似术语的隐式引用. ...
- ISO/IEC 9899:2011 条款5——5.2.1 字符集
5.2.1 字符集 1.两个字符集和它们相关联的依次顺序应该被定义:写在源文件中的集合(源字符集),以及在执行环境中被解释的集合(执行字符集).每个集合此外被划分为一个基本字符集,其内容由本子条款给出 ...
- ISO/IEC 9899:2011 条款6.4.2——标识符
6.4.2 标识符 6.4.2.1 通用 语法 1.identifier: identifier-nodigit identifier identifier-nondigit identifie ...
- ISO/IEC 9899:2011 条款6.4.3——通用字符名
6.4.3 通用字符名 语法 1.通用字符名: universal_character-name: \u hex-quad(四位十六进制数) \U hex-quad hex-quad hex-quad ...
- ISO/IEC 9899:2011 条款6.3——转换
6.3 转换 1.有些操作符将操作数的值自动地从一种类型转换为另一种.本子条款指定了从这么一个隐式转换所要求的结果,以及从一个投射操作(一个显式转换)所要求的结果.在6.3.1.8中所列出的信息概括了 ...
- ISO/IEC 9899:2011 条款5——5.2.4 环境限制
5.2.4 环境限制 1.翻译与执行环境都约束了语言翻译器和库的实现.下面概述了对一个顺应标准实现的语言相关的环境限制:库相关的限制在条款7中讨论. 5.2.4.1 翻译限制 1.实现应该能够翻译并执 ...
- ISO/IEC 9899:2011 条款5——5.1.2 执行环境
5.1.2 执行环境 1.定义了两个执行环境:独立式(freestanding)以及宿主的(hosted).在这两种情况下,当一个派定的C函数被执行环境调用时,程序就启动.所有具有静态存储周期的对象应 ...
- ISO/IEC 9899:2011 条款4——标准顺从
4. 标准顺从 1.在本国际标准中,“应该”被解释为对一个实现或一个程序的要求:相反地,“不该”被解释为禁用. 2.如果违反了出现在一个强制规定或运行时强制规定之外的“应该”或“不该”要求,那么该行为 ...
随机推荐
- 解析Linux中LVM与磁盘配额
LVM 逻辑卷管理 LVM 概述 LVM 是 Linux 操作系统中对磁盘分区进行管理的一种逻辑机制,它是建立在硬盘和分区之上.文件系统之下的一个逻辑层,在建立文件系统时屏蔽了下层的磁盘分区布局,因此 ...
- 9.1: 请每个小组在 cnblogs.com 上面创建团队博客,第一个博客把小组成员都介绍一下 #团队博客作业1------------------答题者:徐潇瑞
大家好,我们这个团队的名字叫14组之家,之所以这么叫,因为我们是在章亦葵老师的现代软件工程课上成立为14组,而且我们每个组员在这个小家庭中都感受到温暖,我们互相协作,互相配合,来完成我们的任务. 首先 ...
- 使用redis事物解决stringRedisTemplate.setIfAbsent()并设置过期时间遇到的问题
spring-date-redis版本:1.6.2场景:在使用setIfAbsent(key,value)时,想对key设置一个过期时间,同时需要用到setIfAbsent的返回值来指定之后的流程,所 ...
- LOJ-1308-Ant network(蚂蚁的网络)-求割点分隔开的子图个数及乘积
网上的题解大都模糊,我可能写的也比较模糊吧,讲究看看. 大致题意: 原图没有一个割点时,特殊考虑,至少ans1=2个通风井,方案数n*(n-1)/2; 原图上有多个割点时,每个(由割点限制成几部分的) ...
- P2P system: FastTrack and BitTorrent
FastTrack FastTrack来源于Gnutella,是Gnutella 和 Napster的杂交体 有些node承担了更重要的责任,这些nodes称为supernodes,因为这些改进,它比 ...
- 【杂谈】操作系统如何有效地掌控CPU
操作系统的本质 操作系统本质上也是一个进程,它与其他用户进程共享CPU.与普通进程不同的是,它具有硬件的所有访问权限.而用户进程默认对硬件是没有任何访问权限的,它只能通过系统调用,委托操作系统来完成这 ...
- 分页器,序列化组件,bulk_create,choices字段
分页器 <!--前端--> {% for book in page_queryset %} <p>{{ book.title }}</p> {% endfor %} ...
- MongoDB 查看存储引擎
需要登录到具体的主/从节点查询,mongos查询不到 db.serverStatus() 其中有这个 "storageEngine" : { "name" : ...
- 二分算法题目训练(四)——Robin Hood详解
codeforces672D——Robin Hood详解 Robin Hood 问题描述(google翻译) 我们都知道罗宾汉令人印象深刻的故事.罗宾汉利用他的射箭技巧和他的智慧从富人那里偷钱,然后把 ...
- hbuilder mui html vue ul li 自定义循环赋值ID
<ul class="mui-table-view mui-table-view-chevron"> <li class="mui-table-view ...