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. AD19新功能之跟随走线

    跟随走线 AD19新增跟随走线,比如需要按照特定的轨迹进行走线,比如要绕着一个圆进行走线,或者靠着边框走线,普通模式下的效果如下图所示,线会跟着指针跑: 在走线模式下,按住 shift + f ,然后 ...

  2. unity和lua开发游戏常备技能

    推荐阅读:  我的CSDN  我的博客园  QQ群:704621321  我的个人博客 一.使用制作滑动列表:使用UILayout做虚拟列表 ui.list = base:findcom(" ...

  3. jmeter接口测试json详解

    本篇围绕jmeter(压力测试工具),请求json与返回json串处理进行解析,初入测试,理解如有不对的地方请大家及时提点~~ 在这里jmeter工具的使用不在做解释 首先说下乱码问题,在这里无脑5步 ...

  4. MySQL之JDBC插入、修改、删除封装集于一个方法

    1. 先建四个包 ① com.tz.entity 实体包 ② com.tz.dao 数据访问层包 -> com.tz.dao.impl 实现包 ③ com.tz.util 工具类包 ④ com. ...

  5. STM32的指令周期

    在keil中编程时,写了一行代码,然后就想知道,执行这句C代码需要多长时间. 时钟周期在这就不解释了,频率的倒数. 指令周期,个人理解就是cpu执行一条汇编指令所需要的时间. 我们知道cm3使用的三级 ...

  6. Codeforces Round #413 (Div1 + Div. 2) C. Fountains(树状数组维护最大值)

    题目链接:https://codeforces.com/problemset/problem/799/C 题意:有 c 块硬币和 d 块钻石,每种喷泉消耗硬币或钻石中的一种,每个喷泉有一个美丽值,问建 ...

  7. Codeforces Round #597 (Div. 2) A. Good ol' Numbers Coloring

    链接: https://codeforces.com/contest/1245/problem/A 题意: Consider the set of all nonnegative integers: ...

  8. DOM设置css样式

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  9. vue上传大文件控件

    文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹.今天研究了一下这个问题,在 ...

  10. NetworkX系列教程(3)-手动创建graph

    小书匠Graph图论 不可否认,日常中我们使用最多的还是,使用自己的数据去手动创建自己的图形,而不是使用生成器,现从给graph添加点和边入手,讲解手动创建graph. 目录: 3.给graph添加节 ...