目录
一、整数
1.任何变量都要初始化
不同平台编译器,赋值不同(不确定),但初始化后不会
2.初始化方式
int num = 10;
int num (10);
int num {10};
3.overflow溢出
计算结果的二进制数过运算范围溢出了,1当做符号位所以是负的
signed int第一位是符号位
unsigned int 全是数据位
4.其他整数类型
- use long int for longer integers.
- use short int for shorter integers.
- and long long
5.测量变量或数据类型占几个字节
sizeof():它是一个操作符不是函数,函数的参数必须是变量
如:
int i = 0;
short s = 0;
cout << "sizeof(int)=" << sizeof(int) << endl;
cout << "sizeof(i)=" << sizeof(i) << endl;
cout << "sizeof(short)=" << sizeof(s) << endl;
cout << "sizeof(long)=" << sizeof(long) << endl;
cout << "sizeof(size_t)=" << sizeof(size_t) << endl;
二、更多的整数类型
1.char字符类型
a)本质上它是一个8位整数
b)signed char: 有符号的8位整数,取值范围:-128 +127
unsinged char:无符号的8位整数,取值范围:0 255
char: either signed char or unsinged char
2.char的初始化
字符本身就是整数,他有一个编码(ASCII码)
char c1 = 'C';
char c2 = 80;//十进制
char c3 = 0x50;//16进制
3.bool类型
a)占一个字节,不是一位
b)值:true (1) or false (0)
c)对bool赋值不是0,则为1
bool b = true;
int i = b; // the value of i is 1 (隐式转换)
bool b = -256; // unrecommended conversion. the value of b is true
bool b = (-256 != 0); // better choice
4.bool类型的本质
typedef char bool;
#define true 1
#define false 0
5.size_t
typedef unsigned int size_t;
a)它是一个整数
b)它一般用来表示内存大小,或元素个数,是数数用的
c)int类型宽度不够,所以有了size_t
6.C++11的整数类型
a)#include <cstdint>
int8_t
int16_t
int32_t
int64_t
uint8_t
uint16_t
uint32_t
uint64_t
b)一些有用的宏
INT8_MIN//8位int的最小值
INT16_MIN
INT32_MIN
INT64_MIN
INT8_MAX
INT16_MAX
INT32_MAX
INT64_MAX
...
7.图像的数据存储
a)int去存储要成4(4个字节)
b)常用char或byte用一个字节表示一个整数(0 255)
图像占内存大小:6720 × 3780 ×3 = 76,204,800 = 76M Bytes
三、浮点数
1. 一些问题
a)[0 1]之间有多少实数:无穷
b)32位可以表达多少数值:2^32,4GB
c)1.2float给的是近似值1.200000047683716(1 2之间采样)
d)浮点数计算会带来微小误差,不能消除
2.浮点数的格式
a)float单精度浮点数,32位,4个字节
i)第一个是符号位,决定正负
ii)exponent指数部分位,放大缩小被
iii)fraction
b)double双精度,64位
c)long double 128位
d)半精度16位,用于深度学习浮点运算
3.浮点数和整数的区别
a)浮点数可以表达整数不能表达的小数
b)范围更广
c)浮点数操作比整数慢,特别乘法除法开方
d)精度降低
e)double 64bit比float更长,运算更慢,若大量密集型计算,如矩阵double和float速度会差很多
4.采样精度不够
float f1 = 2.34E+10f;
float f2 = f1 + 10; // but f2 = f1
增加的数量不要和前面的量级差很多
5.两个浮点数不要使用==判断相等
两个浮点数是近似的,不是精确数
if (f1 == f2) //bad
if (fabs(f1 - f2) < FLT_EPSILON) // good
6.inf和nan
a)inf无穷大
float f1 = 2.0f / 0.0f; ±inf: infinity (Exponent=11111111, fraction=0)
b)nan不是一个数值
float f2 = 0.0f / 0.0f; nan: not a number (Exponent=11111111, fraction!=0)
四、算数运算
1.常量数值
a)
95 // 十进制
0137// 八进制(不要在前面随意加0)
0x5F // 16进制(对程序员友好)
b)常数的书写方式
95 // int
95u // unsigned int (写一个很大的整数超过2^31,有符号的不能表达,加u表达范围*2)
95l // long
95ul // unsigned long
95lu // unsigned long
c)浮点数
3.14159 // 3.14159
6.02e23 // 6.02 x 10^23
1.6e-19 // 1.6 x 10^-19
3.0 // 3.0
d)浮点数书写方式
6.02e23L // long double
6.02e23f // float
6.02e23 // doubl
写像3.0,3.14,不要漏了f,说明常数是float类型,这样就不需要类型转换,如果写3.0再赋值,就是double转float
2.const类型限定符
const float PI = 3.1415926f;
PI += 1; //error!
Pi变量值不可修改,可代替宏定义
3.auto自动类型(c++11)
任意类型,看初始化是什么类型
auto a = 2; // type of a is int
auto bc = 2.3; // type of b is double
auto c ; //valid in C, error in C++错误
auto d = a * 1.2; //double
auto a = 2; // type of a is int
// will a be converted to a
// double type variable?
a = 2.3; //int类型double转int去掉小数位,a=2
a的类型在初始化时定下来就不会改变
4.算数操作符
Operator name | Syntax |
unary plus | +a//不会对a的值做任何改变 |
unary minus | -a |
addition | a + b |
subtraction | a - b |
multiplication | a * b |
division | a / b |
modulo | a % b//求余10%3=1 |
bitwise NOT | ~a//二进制按位取反 |
bitwise AND | a & b//二进制按位运算 |
bitwise OR | a | b |
bitwise XOR | a ^ b//异或操作 |
bitwise left shift | a << b移位操作 |
bitwise right shift | a >> b |
5.优先级
优先级依次降低
- a++
- ++a
- * /
- + -
- << >>
用括号内优先级高
6.其他操作
a)赋值操作
a = b
a += b//a=a+b
a -= b//a=a-b
a *= b
a /= b
a %= b
a &= b
a |= b
a ^= b
a <<= b
a >>= b
b)自增和自减
a++
++a
a--
--a
int a = 3;
int b = a++; // 先取值再++,b=3
int c = ++a; //先+1再取值,b=5
7.数据类型的转换
int num_int1 = 9; // 类型相同不需要类型转换
int num_int2 = 'C'; // c是一个字符,是一个8位整数,隐式类型转换,8->32
int num_int3 = (int)'C'; // 显式转换,转换格式(c-style)
int num_int4 = int('C'); //显式转换,转换格式(function-style)
int num_int5 = 2.8; //implicit conversion 2
float num_float = 2.3; //implicit conversion from double to float
short num_short = 650000; //short里面放不下
8.数据丢失
9.结合律
int i = 17 / 5 * 5;//左到右结合
int i = (17 / 5) * 5;//代码可读性更高
10.除法
a)整数除法
float f = 17 / 5; // f will be 3.f, not 3.4f.结果是整数3,初始化给float 3.0f
b)浮点数除法
float f = 17 / 5.f; // f will be 3.4f. 17.0/5.0
11.算数运算数据类型
只有int, long, float, double
unsigned char a = 255;
unsigned char b = 1;
int c = a + b; // c = ?c= 256若两个unsigned char加法,这个加法只能做int类型去对应会转成int