这篇博文是对2015年秋天C++课件中我不熟悉的地方的总结。
Ch 1
二进制数的编码表示
原码
X=+0101011 [X]原 =0 0101011
X=-0101011 [X]原 =1 0101011
注意: 零的表示不唯一
[+X]原=0 0000000
[+X]原=1 0000000
反码
反码只是求补码的中间码,
- 正数的反码与原码表示相同
- 负数的反码与原码有如下关系
- 符号位保持不变,仍然用1,其余各位按位取反。
补码
- 正数x: [X]补 = [X]原
- 负数x: [X]补 = [X]反 + 1
关于原码,反码和补码的计算,我们可以参照博文http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/computercode.html
有了补码之后,加上一个负数等于加上该数的补码。
[X]原 - [Y]原= [X]原 + [-Y]原= [X]原 + [-Y]补= [X]原 + [-Y]反 + 1
利用 [X]原+[X]反+1 = 128(or sth else)
Big Endian & Little Endian
将一个数据结构(如long int 12345678)储存在cpu中需要多个字节
0 | 1| 2| 3 big endian
3 | 2| 1| 0 little endian
12|34|56|78
0, 1, 2, 3代表内存中存储单元的编号,由低到高。
如果按照数字低位到高位的顺序(87654321)依此储存在各个储存单元0123,则成为little endian。反之,则成为big endian
在实际的操作中, Java编写的程序采用big endian,网络协议采用big endian,但是所有的usb传输采用little endian
Ch 2
变量
变量的声明:
数据类型 变量名1, 变量名2,..., 变量名n;
在定义变量的时候也可以给它赋以初值。
auto
采用对战方式分配内存空间,属于暂时性储存,其储存空间可以被若干变量多次覆盖使用
register
存放在通用寄存器中
extern
在所有函数和程序段中都可以引用
static
在内存中一固定的地址存放,在整个程序运行期间都有效
const
符号常量在声明时一定要赋初值,而在程序中间不能改变其值
逗号表达式
表达式1,表达式2
先求解1,然后求解2,最终结果为表达式2的值。
逻辑运算符
-!:非
- &&:与
- ||:或
上述三个逻辑运算符的优先次序由高到低依此减小。
&& 和 || 具有短路特性,从左到右依此判断,如果表达式1的结果能够判定出逻辑表达式的最后结果,则不会计算表达式2的值。
条件运算符
表达式1 ? 表达式2: 表达式3
等价于
if (表达式1)
表达式2;
else
表达式3;
条件表达式的优先级高于赋值运算符,低于逻辑运算符。
sizeof
sizeof(类型名)
sizeof 表达式
返回考察的对象所占的字节数
& | ^ ~ << >>
- & 按位与
1&x=x
0&x=0
将某一位置零 - | 按位或
1|x=1
0|x=x
讲某一位置一 - ^ 按位异或
对应为相同则零,不同则一
x^1: 将x取反
x^0: 将x保持原值 - ~ 按位取反
单目运算符 - << 左移
低位补零,高位舍弃 - >> 右移
无符号数高位补零,低位舍弃
有符号数高位补符号数,低位舍弃
显示类型转换
继承自C
类型说明符 (表达式)
(类型说明符)表达式
static_cast(expression)
允许执行任意的隐式转换和相反转换动作(即使它不允许是隐式的)。该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性。
它主要由一下几种用法
- 用于类层次结构中积累和子类之间指针或者引用转换
- 进行上行转换(子类的指针或引用转换成基类)是安全的
- 进行下行转换(基类的指针或引用转换成子类)时,由于没有动态类型检查是不安全的
- 用于基本数据类型的转换,因为没有动态类型检查也是不安全的
- 把控制帧转换成目标类型的空指针
- 把任何类型的表达式转换成void类型
- static_cast不能转换掉expression的const、volitale、或者__unaligned属性
dynamic_cast(expression)
该运算符吧expression转换成type-id类型的对象。Type-id必须是类的指针,类的引用或者void*
它只用于对象的指针和引用。当用于多态类型的时候,它允许任意的饮食类型转换以及相反的过程。不过,与static_cast不同,在后一种情况里(隐式转换的相反过程),dynamic_cast会检查操作是否有效。也就是,他会检查转换是否会返回一个被请求的有效的完整对象。检测在运行时进行。如果被转换的指针不是一个被请求的有效完整的对象的指针,返回值则为NULL。
- 如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。
- dynamic_cast主要用于类曾测建的上行转换和下行转换,还可以用于类之间的交叉转换。
- 在类层次见进行上行转换时,dynamic_cast和stastic_cast的效果是一样的。
- 在进行下行转换是,dynamic_cast具有类型检查的功能,比static_cast更安全。
reinterpret_castexpression
用于将一个指针转换为其他类型的指针,也可将一个指针转换为指数类型。反之亦然,reinterpret_cast运算符是用来处理无关类型之间的转换。他会产生一个新的值,这个值会与原始参数(expression)具有完全相同的比特位。
- 从指针类型到一个足够大的整数类型
- 从整数类型或者枚举类型到指针类型
- 从一个指向函数的指针到另一个不同类型的指向函数的指针
- 从一个指向对象的指针到另一个不同类型的指向对象的指针
- 从一个指向类函数成员的指针到另一个指向不同类型的函数成员的指针
- 从一个指向类数据成员的指针到另一个指向不同类型的数据成员的指针
reinterpret_cast用在任意类型指针的转换。以及指针转向足够大正数类型。
const_cast(expression)
该运算符用来修改类型额const、volatile、__unaligned属性
除了const、volatile、__unaligned修饰之外,type-id和expression的类型应该是一样的。
- 常量指针被转化成非常量指针,并且仍然指向原来的对象;
- 常量引用被转换成非常量引用,并且仍然指向原来的对象;
- 常量对象被转换成非常量对象。
这个转换类型操纵传递对象的const属性,或者是设置或者是移除。