- 第二章 变量和基本类型
- 1 int转换成unsigned
- 1.1 原码,反码,补码
- 1.2 int 数据存储
- 1.3 数据转换
- 2 变量声明和定义的关系
- 3 引用和指针
- 3.1 引用
- 3.2 指针
- 3.2.1 获取对象的地址
- 3.3 指针和引用的不同
- 4 const限定符
- 4.1对const的引用
- 4.2 指向常量的指针
- 4.3 顶层const和底层const
- 4.4 constexpr变量
- 5 处理类型
- 5.1 auto 类型说明符
- 5.2 decltype 类型提示符
原码:正数的原码为其二进制表示;负数的原码为其绝对值的二进制表示,并将最高位置为1,表示其符号。
反码:正数的反码与原码相同;负数的反码为其原码除符号位外,其他位按位取反。
补码:正数的补码与原码相同;负数的补码为其反码+1。
1.2 int 数据存储在存储int型数据时,按照原始数据的补码存储。由于最高位是符号位,因此int所能表示数据的范围应为 -2^31 ~ 2^31-1 。例如:
存储int型1时,记录的为:0000 0000 0000 0000 0000 0000 0000 0001 存储int型-1时,记录的为:1111 1111 1111 1111 1111 1111 1111 11111.3 数据转换
int型转换为unsigned int型其实就是把int型的31位和表示符号的最高位,一起看作是unsigned int型的32位一并读取,例如:
int型1:0000 0000 0000 0000 0000 0000 0000 0001,按unsigned的32位读法仍然为1 int型-1:1111 1111 1111 1111 1111 1111 1111 1111,按unsigned的32位读法为 2^32-1 = 4294967295
正数转换为unsigned时,数值与原来相等;负数转换为unsigned时,数值会发生变化。
2 变量声明和定义的关系声明:使得名字为程序所知,一个文件如果想使用别处定义的名字则必须包含对那个名字的声明;
定义:负责创建与名字关联的实体 (notes:定义会申请存储空间)
extern int i;//声明i int j; //声明并定义j
在函数体内部,如果试图初始化一个由extern关键字标记的变量,将引发错误
3 引用和指针 3.1 引用引用并非对象,它只是为一个已经存在的对象所起的另外一个名字,引用必须被初始化
定义引用时,程序将引用和它的初始值绑定在一起,对其进行的所有操作都是在与之绑定的对象上进行的
引用类型的初始值必须是一个对象
int &a = 100 (错误,引用类型的初始值必须是一个对象)3.2 指针 3.2.1 获取对象的地址
指针存放某个对象的地址,要想获取该地址,需要使用取地址符 (&)
3.2.2 指向指针的引用
引用本身不是一个对象,因此不能定义指向引用的指针。但指针是对象,所以存在指针的引用
int *p; int *&r = p;//r是对指针p的一个引用3.3 指针和引用的不同
指针本身就是一个对象,允许对指针赋值和拷贝,而且在指针的生命周期内它可以先后指向几个不同的对象;指针无需在定义时赋初值,在块作用域内定义的指针如果没有被初始化,也将拥有一个不确定的值
4 const限定符const对象一旦创建后其值不能再改变,所以const对象必须初始化
默认状态下const对象仅在文件内有效,如果想在多个文件之间共享const对象,必须在变量的定义之前加上extern关键字
4.1对const的引用double dval = 3.14; const int &ri = dval;
此处为了让ri绑定一个整数,编译器将上述代码变成了如下代码
const int temp = dval;//由双精度浮点数生成一个临时的整型变量 const int &ri = temp;//让ri绑定这个临时量
如果ri不是常量,就允许对ri赋值,这样就会改变ri所引用对象的值,而此时绑定的对象是一个临时量而非dval。所以改变的是temp的值而不是dval的值;
4.2 指向常量的指针指向常量的指针没有规定所指对象必须是一个常量,仅仅要求不能通过该指针改变对象的值,而没有规定那个对象的值不能通过其他途径改变;
const指针
常量指针必须初始化,而且一旦初始化完成,则它的值(也就是存放在指针中的那个地址)就不能再改变了
4.3 顶层const和底层const顶层const表示指针本身是个常量;底层const表示所指的对象是个常量;
int i = 0; int *const p1 = &i;//不能改变p1的值,这是一个顶层const const int ci = 42; const int *p2 = &ci;//允许改变p2的值,这是一个底层const const int *const p3 = p2;//靠右的const是顶层const,靠左的是底层const const int &r = ci; //用于声明引用的const都是底层const
当执行对象的拷贝操作时,顶层const不受影响,而底层const 拷入和拷出的对象必须具有相同的底层const资格,或者两个对象的数据类型必须能够转换
int *p = p3;//错误:p3包含底层const的定义,而p没有4.4 constexpr变量
C++11新标准规定,允许将变量声明为constexpr类型以便编译器来验证变量的值是否是一个常量表达式。声明为constexpr的变量一定是一个常量,而且必须用常量表达式初始化。
5 处理类型 5.1 auto 类型说明符auto让编译器通过初始值来推算变量的类型,auto定义的变量必须有初始值;
auto也能在一条语句中声明多个变量,但该语句中所有变量的初始数据类型都必须一样
5.2 decltype 类型提示符它的作用是选择并返回操作数的数据类型;
decltype((var))的结果永远是引用,而decltype(var)结果只有当var本身就是一个引用时,才是引用。



