1.左值与右值的区别
左值可以放在左边赋值的值。右值可以放在右边的值。
左值,没有内存实体的左值不存在的。Int a=3;
右值,可以有内存实体,也可以没有内存实体. A+1,&a,100,右值,都在寄存器。
Int b=a,在内存实体
CPU处理计算,内存是存储的。
寄存器的内容不可以取内存地址 &(a+1)非法。
赋值的时候,二进制数据在CPU寄存器中产生,赋值的时候,实际上传递二进制的过程。
char ch = -1; //1111 1111
int num = ch;// 1111 1111 1111 1111 1111 1111 1111 1111
printf("%d", num);
//小字节数据转换为大字节数据的时候,填充符号位
掌握内嵌汇编
//data = num + 4;
_asm
{
mov eax,num //num移动到eax
add eax,4 //eax 的值自动+4
mov data,eax //eax的值移动到data
}
2.变量的赋值原理
变量的赋值就是拷贝二进制,内存之间不可以直接拷贝,必须通过CPU,
变量的值发生变化,就是变量的那一段内存,存放不同的二进制数据。
3.Define与const的区别
Define与const最大差别是
#define K 100.0
const int Knum = 100.0;//赋值号会自动进行数据类型转换
const是伪常量,可以改变它的值,不可以用于数组,define可以
改变伪常量:
const int num = 10;//伪常量
int *p = (int *)#//C++强类型
*p = 3;//指针赋值,const不靠谱
printf("%d", num);
const常量只有在初始化的时候是左值,const常量有内存实体
int data = 10;
const int num=20;//常量必须初始化,可以接受任何赋值
const int num = data;//编译的时候避免出错,避免对不该赋值的赋值
理解下C++强类型,C弱类型,区别是赋值的时候,C++会严格检测类型。
const int Knum = 100.0;//赋值号会自动进行数据类型转换
4.Printf特点
printf不会自动进行数据类型转换,打印的变量必须匹配打印方式
printf("%d,%d", 10.9, 10);//printf,第一个错误,第二个连带错误
5.指针数据类型
指针是一种数据类型,类型决定了大小,决定了二进制数据的解析方式,指针变量存储的是地址,因为类型,同一个地址也有所不同。
int num = 100;
double *p1 = #
int *p2 = #
float *p3 = #
printf("%f\n", *p1);
printf("%d\n", *p2);
printf("%f\n", *p3);
6.Long long和long double
Long long用于存储大整数重点
Longlong打印用%lld
long,int32位,64位平台等价,16位平台int与short等价
7.处理浮点数,处理整数字符的极限
极限的意义
//所有的数据操作,赋值,计算,极限范围之内不会错误
//极限范围之外,偶尔正确,一定出错。
8.补码阶码概念
补码存储负数,阶码存储实数
补码吧-0当作尾部最后一个数,可以多表示一个数据
printf不会自动进行数据类型转换。
%d是有表示范围的。
9.变量在内存中的存储
所有的计算机,负数手机电脑都是补码存储,实数是阶码存储。
10.补码
补码理解负数的存储方式,赋值方式,printf不经转换直接解析的方式
数据转换的时候,无符号数据填充0,有符号数据填充符号位。
补码的加法速度要快于原码
补码与数据极限的关系,补码的-0多存储一个数据。
11.指针的高级处理方式
指针的高级处理方式,内存检索,改变指针的类型,检索任意数据
指针的类型决定了长度,决定了解析方式,指针变量的值仅仅存储地址
12.位运算
|运算符
// 1|1 -> 1 0|1 -> 1
// 1|0 ->1 0|0->0
//0101 1010
//1111 0000
//1111 1010 //指定的字段置1
&运算符
// 11->1 01->0
//10->0 00->0
//0101 1110;
//0000 1111
//0000 1110 //某一段清零用&
^异或运算符
// 1^1 0^0 0
// 1^0 0^1 1
//1010 0101
//1111 0000
//0101 0101 //指定的字段反转,交换数据
~取反运算符
unsigned char ch1 = ~0;
//0000 0000
//1111 1111 255
左移等价于×2,右移等价于/2
异或:指定的字段反转,交换数据