标签:复杂 就是 com -128 实例 作用域 struct 区分 string
1.每个对象都是描述客观存在事物的一个实体,是由数据和方法(属性和行为)构成
2.属性是描述事物特征的数据
3.行为描述对对象属性的一些操作。
1.类是具有相同属性和行为的一些对象的集合,它为所有属于这个类的对象提供抽象的描述
1.也就是把客观的事物封装成抽象的类,并且类可以把自己的属性方法只让可信的类和对象操作 对不可信的隐藏内部细节
基类(父类)、派生类(子类)
派生类可以通过继承父类来拥有父类的所有属性和行为
1.指在一般类中定义的属性和行为,被特殊类继承后,可以拥有不同的数据类型或表现出不同的行为,这使得同一个属性或行为在一般类及其各种特殊类中拥有不同的语义。
2.多态包含(重载、覆盖、引用)
1.在同一作用域中,方法名相同,但形参列表不同(个数,类型,顺序),我们称之为函数重载
2.无法以返回类型作为重载函数的区分标准
3.main函数不能重载
#include<iostream> #include<string> using namespace std; struct name{ string str; }; struct Phone{ string tel; }; void lookup(name n){ cout << n.str << endl; } void lookup(Phone phone){ cout << phone.tel << endl; } int main(){ Phone phone; phone.tel = "123456778910"; name n; n.str = "zhangsan"; lookup(phone); lookup(n); system("pause"); return 0; }
1.就是面向对象中的多态,派生类的方法覆盖基类的方法,以实现不同的功能,或者对基类的功能进行扩充。
2.方法名相同,参数相同,返回类型相同, 方法的权限不能比父类小(例如:父类中为 public 子类中不能为 private)
#include<iostream> using namespace std; class father{ public: void f(int a); }; void father::f(int a){ // ::为作用域运算符 cout << "i am father" << " "<< a << endl; } class son :public father{ // :为继承运算符 public: void f(int a); }; void son::f(int a){ cout << "i am son" << " "<<a << endl; } int main(){ father fa; fa.f(5); system("pause"); return 0; }
1.抽象类是包含抽象方法的类(java) 纯虚函数(c++),只有方法头没有方法体,关键字为 abstract(java) virtual(c++).
2.抽象类不能实例化(不能建立抽象类对象),只能作为父类
3.抽象类不能用作参数类型、函数返回类型或显式转换的类型。
4.可以定义指向抽象类的指针和引用,此指针可以指向它的派生类,进而实现多态性。
关键字 interface(接口) implement(实现 java)
1.在C++中,通过类实现面向对象的编程,而在基类中只给出纯虚函数的声明,然后通过在派生类中实现纯虚函数的具体定义的方式来实现接口,
2.不同派生类实现接口的方式也不尽相同,从而实现多态.
3.接口中的方法全为抽象方法
4.子类可以实现多个接口
按权展开求和
for example :
11.01(二进制) = 1×2^1 + 1×2^0 + 0×2^(-1) + 1×2^(-2) = 3.25
要将数的整数部分和小数部分分别进行转换,分别按除r取余数和乘r取整数两种不同的方法来完成。
先得到的余数为结果的低位,先得到的整数为小数的高位
每位八进制相当于三位二进制,每为十六进制相当于四位二进制
位、字节、字
这是数据的最小单位,表示一位二进制数据
由八位二进制数据组成,字节是数据存储中最常用的基本单位,1k等于1024字节。
位的组合,作为一个独立的信息单位处理。取决于机器的类型、字长及使用者的要求。
常用的固定字长有8位、16位、32位。
讨论信息单位时,有个与机器硬件指标有关的单位就是机械字长, 一般指参与运算的寄存器所含有的二进制的位数,它代表了机器的精度,如32位、64位等。
计算机存储数据信息都是以二进制编码存储的,计算机要使用一定的编码方式进行存储,原码,反码,补码是机器存储一个具体数字的编码方式。
最高位是符号位,后面数为要表示数的绝对值,符号位放在数的最高位,0表示正号 1表示负号。其中存在一个问题:0的表示不唯一
正数的反码和原码一样,负数的反码的符号位和原码一样,但其他位取反
for example:
二进制+1100111的原码为 01100111,反码也为 01100111
二进制-1100111的原码为 11100111,反码为 10011000
正数的补码、反码、原码一致,负数的补码是其反码的最末尾加1得到,即负数的补码为负数的原码:符号位不变其余取反再加一
计算机辨别符号位会让计算机的基本电路设计变得十分复杂,于是将符号位也参与运算,根据减去一个正数等于加上一个负数 即 1-1=1+(-1)=0 ,所以机器可以只有加法没有减法。
计算十进制的表达式:1-1=0
1-1=1+(-1)=[00000001]原+[10000001]原=[10000010]原=-2
显然结果不正确。
为了解决原码做减法的问题,出现了反码
计算十进制的表达式:1-1=0
1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]反+[1111 1110]反=[1111 1111]反=[1000 0000]原=-0
发现反码计算减法,真值部分是正确的,但是唯一的问题是"0"这个特殊的数值上,[0000 0000]原 和 [1000 0000]原 两个编码都是0
补码的出现解决了0的符合以及两个编码的问题
1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]补=[0000 0000]原=0
这样0用[0000 0000]原 表示,可以用[1000 0000]表示-128
(-1)+(-127)=[1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
在补码运算结果中[1000 0000]补 就是-128 但注意因为实际上是使用以前-0的补码来表示-128,所以-128并没有原码与反码 使用补码不仅仅修复了0的符号以及两个编码的问题,而且多出一个最低数,这就是为什么8位二进制使用原码或者反码表示的范围为[-127,+127] 而使用补码表示的范围为[-128,+127]
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.
两个整数a,b,若它们除以整数m所得的余数相等,则称a,b对于模m同余,记作 a ≡ b (mod m);
首先取模的数学定义为 x mod y = x- y* (x/y)的下界 (y!=0)
实现用正数替代负数
证明过程:需要用到同余数的两个定理:
1.反身性 a ≡ a (mod m)
2.线性运算定理:
如果:a ≡ b (mod m),c ≡ d (mod m)
那么: (1)a ± c ≡ b ± d (mod m) (2)a * c ≡ b * d (mod m)
现在我们为一个负数找到它的正数同余数
for example 7 -2 ≡ 7 + 10 (mod 12)
对于8位二进制 MOD=2^8
浮点数N的科学表示法: N=sign*M*2^E
1.sign称为N的符号位
2.E称为N的阶码(指数位),它的位数反应了浮点数的范围
3.M表示N的全部有效数字(尾数部分)
浮点数的存储格式与机器有关,如果机器是32位机,其二进制浮点数的组成为1位符号位、8位阶码、23位尾数
2018-09-19
标签:复杂 就是 com -128 实例 作用域 struct 区分 string
原文地址:https://www.cnblogs.com/ccsuCBG/p/9678387.html