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 ...
随机推荐
- 运输层7——TCP的流量控制和拥塞控制
目录 1. TCP的流量控制 2. TCP的拥塞控制 写在前面:本文章是针对<计算机网络第七版>的学习笔记 运输层1--运输层协议概述 运输层2--用户数据报协议UDP 运输层3--传输控 ...
- 赤池信息准则AIC,BIC
很多参数估计问题均采用似然函数作为目标函数,当训练数据足够多时,可以不断提高模型精度,但是以提高模型复杂度为代价的,同时带来一个机器学习中非常普遍的问题——过拟合.所以,模型选择问题在模型复杂度与模型 ...
- C# String 字符拼接测试(“+”、string.Format、StringBuilder 比较)
对于字符串的拼接自己一直有疑问,在何时该用什么方法来拼接?哪种方法更好.更适合. 几种方法 1.“+” 拼接字符串 现在在 C# 中,字符串进行拼接,可以直接用 “+” 而且可以直接用于数字类型的而不 ...
- WebStorm 简单搭建NodeJs服务
开始使用 WebStorm 搭建( WebStorm 请自行安装...... ) 在 项目 根目录 新建个 app.js 开始 编写 app,js // 引入 HTTP 模块 const http = ...
- Vue 定义全局变量
main.js 中定义 import Ws from './lib/ws' import ElementUI from 'element-ui'; import GlobalFunc from './ ...
- Kylin介绍 (很有用)
转:http://blog.csdn.net/yu616568/article/details/48103415 Kylin是ebay开发的一套OLAP系统,与Mondrian不同的是,它是一个MOL ...
- Codeforces Round #459 (Div. 2) C题【思维好题--括号匹配问题】
题意:给出一个串,只包含 ( ? ) 三种符号,求出有多少个子串是完美匹配的. ( ) ? ) => ( ) ( ) 完美匹配( ( ) ? => ( ( ) )完美匹配? ? ? ? = ...
- mongodb 导入json文件遇到的坑
使用mongoimport命令导入外部json文件时,发现一直报错 报错结果如下: json数据格式完全正确如下: 经过再三确认格式最终找到解决方案,原来用cmd导入数据时json { }包含的数据 ...
- Oracle 中MERGE语句的用法
原文章出处(http://blog.csdn.net/lichkui/article/details/4306299) MERGE语句是Oracle9i新增的语法,用来合并UPDATE和INSERT语 ...
- C/C++ -- 判断字符串中存在中文
电脑系统中的英文字符串和中文字符最根本的区别就在于: 1.英文的 ASCII 码,其最高位为 0,占一个字节 注:英文的ASCII码范围是在0到127,二进制为(0000 0000 ~ 0111 11 ...