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的补);

——符号位具有值-(2- 1)(1的补);

应用上述三种方法的哪一个是由实现定义的,即作为带有符号位1的值并且所有值位都是0(对于前两种),还是符号位与所有位都是1(对于1的补),是一个陷阱表示还是一个正常的值。在符号与量以及1的补的情况下,如果这种表示是一个正常值,那么它被称为一个负0。

3、如果实现支持负零,那么它们将仅通过以下方式生成:

——对产生负零值的操作数使用&,|,^,~,<<以及>>操作符;

——使用+,-,*,/操作符,其中一个操作数为负零,并且结果为零;

——基于上述情况的复合赋值操作符。

这些情况实际生成一个负零还是一个正常的零是未指定的,并且当存储到一个对象中时,一个负零是否会变为一个正常的零也是未指定的。

4、如果实现不支持负零,那么对会产生这么一个值的操作数使用&,|,^,~,<<,和>>操作符的结果是未定义的。

5、任何填充位的值都是未指定的。[注:某些填充位的组合可能生成陷阱表示,比如,如果一个填充位是一个奇偶校验位。不管怎么说,对有效值进行算术操作不会产生一个陷阱表示,除非是一种异常情况的一部分,诸如一个溢出。填充位的所有其它组合是由值位所指定的值的可替换的对象表示。]一个带符号整数类型的一个有效(非陷阱)对象表示,这里符号位是零,是相应无符号类型的一个有效对象表示,并且将表示相同的值。对于任一整数类型,所有比特位都是零的对象表示应该是那个类型的零值表示。

6、一个整数类型的精度是它用于表示值所使用的比特位的个数,不包括任一符号位与填充位。一个整数类型的宽度是相同的,但包括任一符号位;因而对于无符号类型,两个值是相同的,而对于带符号类型,宽度比精度要大。

ISO/IEC 9899:2011 条款6.2.6——类型的表示的更多相关文章

  1. ISO/IEC 9899:2011 条款6.7.3——类型限定符

    6.7.3 类型限定符 语法 1.type-qualifier: const restrict volatile _Atomic 约束 2.除了指针类型(其被引用的类型是一个对象类型)之外的类型,不应 ...

  2. ISO/IEC 9899:2011 条款6.7.8——类型定义

    6.7.8 类型定义 语法 1.typedef-name: identifier 约束 2.一个typedef名指定了一个可变修改的类型,然后它应该具有语句块作用域. 语义 3.在一个声明中,该声明的 ...

  3. ISO/IEC 9899:2011 条款6.7.7——类型名

    6.7.7 类型名 语法 1.type-name: specifier-qualifier-list    abstract-declaratoropt abstract-declarator: po ...

  4. ISO/IEC 9899:2011 条款6.7.2——类型说明符

    6.7.2 类型说明符 语法 1.type-specifier: void char short int long float double signed unsigned _Bool _Comple ...

  5. ISO/IEC 9899:2011 条款6.2.5——类型

    6.2.5 类型 1.存储在一个对象中的值或由一个函数所返回的值的意义由用于访问该对象的表达式的类型来确定.(声明为一个对象的一个标识符是最简单的这种表达式:其类型在标识符的声明中指定.)类型被划分为 ...

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

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

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

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

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

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

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

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

随机推荐

  1. 关于strlen和sizeof的使用

    在学习C语言中发现strlen和sizeof的关系不是很明确,今天来总结一下这两个的区别: sizeof 是运算符,用来计算字节数,在计算字符串数组大小时包含(\0) 在编译时计算大小,参数可以是数组 ...

  2. nginx 作用,初认识

    访问网站的dns域名解析 1.浏览器缓存之前解析的域名对应的ip 2.在本机host文件中配置的域名与ip对应的地址 3.最后都没映射,指向的域名的万网服务器,拿到真实域名对应的ip. nginx 作 ...

  3. 找到一些经验,关于使用thymeleaf时遇到的一些问题

    最近一直在使用spring boot,所以自然而然的使用了thymeleaf,但是我想说习惯了jsp之后使用thymeleaf真实觉得不顺手,在使用thymeleaf中也遇到了一些问题,在这里记录一下 ...

  4. CSS绝对定位详解

    设置为绝对定位的元素框从文档流完全删除,并相对于其包含块定位,包含块可能是文档中的另一个元素或者是初始包含块.直线电机生产厂家 元素原先在正常文档流中所占的空间会关闭,就好像该元素原来不存在一样.元素 ...

  5. 学习了武沛齐讲的Day11-完

    DAY11 老师讲了很多,理解了一个方法   当有复杂的问题时,先拆解很小的单元(10行),测试通过了,再简化(3行) len range 感悟:其实不用计记代码(主要是记不动),,当遇到问题时:找出 ...

  6. Mysql查看所有表的数据量

    ##查看所有表信息 SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'pcms-zgh20190327' ##查看各个表数据量 ...

  7. js图片上传 的方法

    先规划出框架 <div id="AQA" style="width:300px; height:200px; background-color:aquamarine ...

  8. P2637 第一次,第二次,成交!

    题目描述 因为奶牛们的节食运动(奶牛还节食?)给农夫JOHN余下了一大批干草无法处理,所以他准备要开一个拍卖会去出售他的干草.他有N(1<=N<=1000)批干草(每批大约100捆).他的 ...

  9. Set集合类

    1.1  Set.add方法——向Set集合添加对象 public static void main(String[] args) {  Set set = new HashSet();      / ...

  10. linux下安装python3.6.6

    1.到python的官网去下载python3.6.3安装包,必须是Linux版本的 2.在/usr/tmp下下载python安装包 wget https://www.python.org/ftp/py ...