ISO/IEC 9899:2011 条款6.2.6——类型的表示
6.2.6 类型的表示
6.2.6.1 通用类型
1、所有类型的表示都是未指定的,除了在本小节所描述的之外。
2、除了位域(bit-field),对象由连续的一个或多个字节序列构成,这些字节序列的字节个数、次序以及编码方式要么被显式指定,要么由实现定义。
3、存储在无符号位域中以及unsigned char类型中的值应该使用一个纯粹的二进制表示法来表示。[注:使用二进制数字0和1的整数的一个按位表示]
4、任一其它对象类型的非位域对象中所存储的值由n * CHAR_BIT位组成,这里n是那个类型的一个对象的大小,用字节表示。该值可以被拷贝进类型unsigned char[n]的一个对象中(比如,通过memcpy);字节的结果集被称为值的对象表示。在位域中所存储的值由m位比特构成,这里m是用于位域的所指定的大小。对象表示为由在保持该对象的可寻址存储单元中位域所组成的m比特集。具有相同对象表示的两个值(除了NaN)比较为相等,但是比较为相等的两个值可能具有不同的对象表示。
5、某些对象表示不需要表示该对象类型的一个值。如果一个对象所存储的值具有这么一种表示,并且被一个左值表达式所读,该左值表达式不具有字符类型,那么该行为是未定义的。如果这么一个表示由一个修改该对象所有或任一部分的副作用产生,通过一个不具有字符类型的左值表达式,那么行为是未定义的。[注:从而,一个自动变量可以被初始化为一个陷阱表示,而不用引发未定义行为,但是该变量的值不能被使用,直到有一个合适的值存放在里面。]这么一个表示称为一个陷阱表示。
6、当一个值被存储在结构体或联合体类型的一个对象中,包括在一个成员对象中时,该对象表示的字节,对应于任意填充的字节,采用未指定的值。[注:从而,比如说结构体赋值不需要拷贝任何填充位。]一个结构体或联合体对象的值永远不是一个陷阱表示,即使该结构体或联合体对象的一个成员的值可能是一个陷阱表示。
7、当一个值被存放在联合体类型的一个对象的成员中时,那么不对应于那个成员但对应于其它成员的那个对象表示的字节取未指定的值。
8、一个操作符被应用于具有多种对象表示的一个值上,无论使用哪种对象表示都不应该影响结果的值。[注:对于具有相同有效类型T的对象x和y具有相同的值,当它们作为类型T的对象被访问时,但在其它上下文中具有不同的值。特别地,如果==为类型T而被定义,那么x == y并不暗示memcmp(&x, &y, sizeof(T)) == 0。此外,x == y并不需要暗示x和y具有相同的值;其它对类型T的值操作可能区分它们。]一个值被存放在使用一个具有多个对象表示的一个类型的一个对象中,使用哪种表示是未指定的,但不应该产生一个陷阱表示。
9、具有原子类型的对象的加载和存储用memory_order_seq_cst语义来实现。
6.2.6.2 整数类型
1、对于除了unsigned char以外的无符号整数类型,对象表示的比特位应该被划分为两个分组:值位与填充位(填充位可省)[译者注:比如对于一个包含位域的结构体,像struct { unsigned char a : 2; unsigned char b : 4; } s; 那么对象s具有8个比特(1个字节),前6比特为值位,后2比特为填充位]。如果有N个值的比特,那么每个比特应该表示一个不同的在1到2N-1之间的2的幂,以至于该类型的对象应该能够使用一个纯粹的二进制表示法来表示从0到2N-1的值;这将被称之为值表示。任何填充比特的值是未指定的。[注:填充比特的某些组合可能会产生陷阱表示,比如,如果一个填充比特是一个校验位。不管怎么样,在有效值上的算术操作都不会产生陷阱表示,除非作为异常情况的一部分,比如一个溢出,并且这不会随无符号类型发生。所有其它填充位的组合是由值比特所指定的值的可选的对象表示。]
2、对于带符号整数类型,对象表示的比特位应该被划分为三组:值位、填充位与符号位。填充位可缺省;signed char不应该有任一填充位。 符号位应该恰好有1位。对于值位的每个比特应该与相应无符号类型所表示的对象中的同一个比特具有相同的值(如果在带符号类型中有M值比特,而在无符号类型中有N值比特,那么M ≦ N)。如果符号位为0,那么它将不影响结果值。如果符号位为1,那么该值将以以下三种方式的其中之一被修改:
——相应于带有符号位0的值,取相反数(符号与量);
——符号位具有值-(2M)(2的补);
——符号位具有值-(2M - 1)(1的补);
应用上述三种方法的哪一个是由实现定义的,即作为带有符号位1的值并且所有值位都是0(对于前两种),还是符号位与所有位都是1(对于1的补),是一个陷阱表示还是一个正常的值。在符号与量以及1的补的情况下,如果这种表示是一个正常值,那么它被称为一个负0。
3、如果实现支持负零,那么它们将仅通过以下方式生成:
——对产生负零值的操作数使用&,|,^,~,<<以及>>操作符;
——使用+,-,*,/操作符,其中一个操作数为负零,并且结果为零;
——基于上述情况的复合赋值操作符。
这些情况实际生成一个负零还是一个正常的零是未指定的,并且当存储到一个对象中时,一个负零是否会变为一个正常的零也是未指定的。
4、如果实现不支持负零,那么对会产生这么一个值的操作数使用&,|,^,~,<<,和>>操作符的结果是未定义的。
5、任何填充位的值都是未指定的。[注:某些填充位的组合可能生成陷阱表示,比如,如果一个填充位是一个奇偶校验位。不管怎么说,对有效值进行算术操作不会产生一个陷阱表示,除非是一种异常情况的一部分,诸如一个溢出。填充位的所有其它组合是由值位所指定的值的可替换的对象表示。]一个带符号整数类型的一个有效(非陷阱)对象表示,这里符号位是零,是相应无符号类型的一个有效对象表示,并且将表示相同的值。对于任一整数类型,所有比特位都是零的对象表示应该是那个类型的零值表示。
6、一个整数类型的精度是它用于表示值所使用的比特位的个数,不包括任一符号位与填充位。一个整数类型的宽度是相同的,但包括任一符号位;因而对于无符号类型,两个值是相同的,而对于带符号类型,宽度比精度要大。
ISO/IEC 9899:2011 条款6.2.6——类型的表示的更多相关文章
- ISO/IEC 9899:2011 条款6.7.3——类型限定符
		6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应 ... 
- ISO/IEC 9899:2011 条款6.7.8——类型定义
		6.7.8 类型定义 语法 1.typedef-name: identifier 约束 2.一个typedef名指定了一个可变修改的类型,然后它应该具有语句块作用域. 语义 3.在一个声明中,该声明的 ... 
- ISO/IEC 9899:2011 条款6.7.7——类型名
		6.7.7 类型名 语法 1.type-name: specifier-qualifier-list abstract-declaratoropt abstract-declarator: po ... 
- ISO/IEC 9899:2011 条款6.7.2——类型说明符
		6.7.2 类型说明符 语法 1.type-specifier: void char short int long float double signed unsigned _Bool _Comple ... 
- ISO/IEC 9899:2011 条款6.2.5——类型
		6.2.5 类型 1.存储在一个对象中的值或由一个函数所返回的值的意义由用于访问该对象的表达式的类型来确定.(声明为一个对象的一个标识符是最简单的这种表达式:其类型在标识符的声明中指定.)类型被划分为 ... 
- 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 ... 
随机推荐
- Codeforces Round #524 (Div. 2)  Masha and two friends矩形
			题目 题意: 给一个n*m块大的黑白相间的矩形,在这个举行中操作,要先把第一个矩形(左下角坐标(x1,y2),右上角坐标(x2,y2)) 全部涂成白色,再把第二个矩形(左下角坐标(x3,y3), ... 
- Docker那些事儿之初识Docker
			公司内部一直在使用Docker进行服务的部署和应用的升级,从开始使用Docker一直到线上的部署以及一些基础服务的开发本人都有参与,而且自己的网站也是在Docker的基础之上进行构建的,想想也需要总结 ... 
- 01-Spring概述
			1.spring是什么 Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(Aspect Orient ... 
- 使用SpringTask 进行Java定时任务开发
			(我这里的案例 是模拟 将项目包放到tomcat里面运行 ) 新建一个Java Web的Maven项目....... 此过程省略... 项目结构如图: 1.pom.xml 配置 <?xml ve ... 
- LeetCode刷题分类-解题模式
			模式1:如果是已经排好序的序列(数组,链表,或是矩阵),我们就可以用二分的变种或是双指针策略 模式2: 如果我们需要处理n个元素中:顶部/最大/最小/最接近的k个元素时,我们就可以用堆来解决了. 模式 ... 
- 脚本put数据到hdfs
			1.vim putdata.sh 脚本功能: 每小时的第15分钟把上一小时的数据put到hdfs相应目录 为了避免大量的小文件,我们把文件夹下的文件cat到一个临时文件里,put成功后删除这个临时文件 ... 
- 获取Druid连接池里当前连接数
			JdbcTemplate jdbcTemplate=(JdbcTemplate) SpringUtils.getBean("jdbcMysqlTemplate"); DruidDa ... 
- LOJ P10149 凸多边形的划分 题解
			Analysis 区间dp+压位高精 dp五分钟,高精两小时 #include<iostream> #include<cstdio> #include<cstring&g ... 
- learning scala for comprehensions
			code: package com.aura.scala.day01 object forComprehensions { def main(args: Array[String]): Unit = ... 
- exam8.3
			rank25凉凉好吧......T1:... 一开始完全** 手玩给的那张图(不放图,我太饿把图吃了) 发现对于任一个节点,减去上一个比他小的斐波那契数就是父 ... 
