Part Two Data Type

来源:互联网 发布:万国数据 杜秋 编辑:程序博客网 时间:2024/05/29 19:47

      

内部数据类型(inner type)与基本数据类型(base type)的区别:内部数据类型是指语言本身具有的数据类型,主要指整数类型及其相关的衍生类型,浮点类型及其相关的衍生类型。而基本数据类型是指由内部数据类型及其适当的“变形”构成的数据类型。

自定义数据类型是主要是指用class关键字构造的数据类型。还有enum,union,struct

通常计算机语言在计算机内部都是用二进制补码的形式表示整数的。其意义在于简化运算。(Page85)

十进制正整数转换补码,除2取余:35100011

十进制负整数转换补码,先按正整数除2取余求出低位到高位的二进制表示,然后取反加1。如:1511110001Page 86

二进制补码运算中,减法相当于取反相加,如最高位有进位,则弃之了事。如:3-5=0000 0011+1111 1011=1111 1110

二进制整数左移相当乘2,右移除2.

 

默认类型(signed或者unsigned)并不是C++标准。(Page87)

 

所谓32位编译器是指能将程序源代码编译成最高为32位的CPU指令系统代码,或者更加直接地说,int类型是32位的。(Page 88)

    为了使编出的程序具有可移植性,在各种机器指令环境下,或者说在各种操作系统环境下运行,都能得到惟一的结果,必须分辨编译器。例如在16位机器指令系统中有符号整数的最大值是32767,如果安装了32位编译器,写了这样的代码: int a=327777;这是不合适的,该定义语句在较低版本指令系统中应为:long int a=327777;

整数字面值:整数用具体的数值表示。

%运算时,余数的正负取决于被除数。

为了代码可移植,不要用数字对字符变量进行赋值。例如:for(char ch=’A’;ch<=64+2*i;++ch) //不应写成ch=65;

枚举符一旦定义则不能改变,用来代替整数常量,这就是语言中设计枚举的真实意图。当然进入函数调用或其它模块时,常量需要初始化,而枚举是一种类型,无须定义其实体,便直接使用。

十进制浮点数转换二进制浮点数。分为两步,整数部分采取除2取余,小数部分乘2取整,直到小数部分为零。(Page 93)

二进制浮点数规格化。通过调整阶码使得该数的有效值在12之间,即整数部分为1

单精度:标准32位浮点数;双精度:标准64位浮点数。

浮点数中的尾数(mantissa)即是小数部分。例如,-0.3065x1030.3065是小数部分,其左右端非0数字包起来的最长的数字序列称为有效值(significance),这里的有效值是3065。不管小数点怎么移动,有效值不会变,尾数则不然。

浮点数相加,阶码对齐,尾数相加。

十进制浮点数规格化(normalization),即通过调整阶码,写成小数点前不含有效数字,小数点后第一位由非0数字表示。规格化目的是统一有效值和尾数。(Page 93)

计算机内部浮点数的表示。(Page 94)

浮点数的阶码为8位,阶值在—126~127,另外两个值,—127和—128用来表示特殊浮点数。其中127表示阶码为—126的非规格化数,非规格化数即不做规格化的二进制浮点数,也即有效值不省略小数点前的1,只用23位尾数。所以当浮点数尾数全为0时,该数就是浮点数0(前提是阶码为—127。另外,当阶码为—128时,表示的是非法操作的数(称为NaNNot a Number或者正负无穷,一般由于除000次方,或者运算结果超出所能表示的范围。

为了使浮点数0和整数0统一,即位码全0表示0。标准单精度浮点数对所有规格化和非规格化二进制数阶码一律做+127的偏移操作。而在取出该浮点数时,再做一个-127的逆操作。例如35.6=100011.1001=1.100011100110011001*2^5=0,10000100,0001110011001100110,其中两个逗号将浮点数分成三段,第一段0表示该数为正, 第二段1000100为指数5加上127所得,第三段是规格化后的23位尾数。

单精度浮点数最接近于0的数由非规格化的特殊浮点数所表示,约为±1.4×10-45,非规格化数只能象征性地表示最接近于0的数,因为其表示精度差。

C++中,有两种字符串,一种是从C沿袭过来的,称为C-Strings,是以一个全0位(整数0)字节作为结束符的字符序列。C-Strings类型为char *,更明确地说是const char *,字符指针。

C串比较函数strcmp,复制函数strcpy,连接函数strcat,倒置函数strrev,设置函数strset,查找函数strchr

Getline总是将行末的回车符滤掉,如若有许多行,且其中夹杂着其他数据类型时,可借助于getline然后逐个分解行中的数据。

String变量与stringistringstream对象)istringstream对象可以绑定一行字符串,然后以空格为分隔符把该行分隔开来。把strings当作输入流。(关于输入输出流:The goal of InputStream and OutputStream is to abstract different ways to input and output: whether the stream is a file, a web page, or the screen shouldn't matter. All that matters is that you receive information from the stream (or send information into thatstream.)InputStream is used for many things that you read from. OutputStream is used for many things that you write to.就好比流水生产线一样,产品进入生产线,你拿起它进行检验(input stream),检验完成后,再放入生产线中让它合格流出(output stream)

事实上,常量在编译时经常是优化的目标,能省略内存空间访问就应该省略,讲求效率的C++编译器会乐此不疲。

数组的几种初始化方法。Page 104

具有初始化的数组,方括号中的元素个数可以省略,即常量表达式。

根据数组名和元素的大小求得数组元素个数(sizeof()),具有很好的通用性。

向量元素位置也属于一种类型,称为遍历器。遍历器不单表示元素位置,还可以在容器中前后挪动。每种容器都有对应的遍历器。

Vector的四种定义方式。Page 107

Vector常用操作

assign(),back(),clear(),empty(),front(),pop_back(),push_back(),resize(),==,!=…

Swap操作是专门为两个向量之间互相交换的性能而设计的。

冒泡排序:两重循环,第一次排N个数,第二次排前N-1个数,...

不要混淆int *ip=&count*ip=&count前者是带有初始化的指针定义,后者是错误的赋值语句,因为*ip间接访问(dereference)所指向的整形实体的操作,而&count并非整形实体,左右两边类型不一致,因而导致错误。

指针忘了赋值,比整形变量忘了赋值危险得多了,这种不安全性也是C++引入引用的重要意图所在。

C++如何看待转换以及如何转换。(Page 115

C++中的转换有重解释转换reinterpret_cast<type>静态转换static_cast<type>动态转换dynamic_cast<type>和写开禁转换const_cast<type>

指针的类型性体现在间接访问(dereference)时,不同类型的指针不能相互赋值。例如:int *ip=&ffloat的地址不能赋给int指针,但从地址的本质来说,无非是用二进制表示的整数而已,就内存空间位置性而言,不同类型的指针又是统一的,都是二进制的地址。所以不能完全隔离这种不同地址间的联系。于是,在C中,就有了强制转换cast

指针变量所占的空间大小总是等同于整型变量的大小。但它不是整型数,数据类型三要素:数据表示,范围表示,操作集合。指针虽与整型有相同的数据表示,相同的范围表示,但它们具有不同的操作。例如:整型变量不能进行间访操作。

指针加减整型数大多数用在数组这种连续的又是同类型元素的序列空间中。

指针的增减是以该类型的实体大小为单位的:对float指针加6实际增加了24个字节;

long  int指针加5实际增加了20个字节;对char指针减7实际减少了7个字节;对double指针减2实际减少了16个字节。

由于指针可以操作的目标不同(地址和实体数),所以指针的常量性也分为两种:一种是指针常量(constant pointer,另一种是常量指针(pointer to constant,指针常量是相对于指针变量而言,即指针值不能改变。常量指针是指向常量的指针。指针的限定在函数参数传递中较常用。(Page 117

Const修饰只是限定指针的操作,但不能限定空间上的实体的可改变性。因为一个实体可能不止被一个变量所关联,所以实体被其他关联变量改变也是可能的。

引用定义时必须初始化,这是它与指针根本不同的地方,而且引用的类型与实体的类型必须一致,否则,无法通过编译。

引用的限定与指针的限定相似,它们在函数参数传递中大显身手。

在大量涉及抽象编程的地方,很少看到数组的踪迹,然而在许多低层的实现中,在讲求性能的编程中,用数组还是需要的。如果不是对性能有苛刻的要求,那绝对应将向量作为首选