进制、C语言内存分配
1.对于进制
10进制 (0 - 9)
16进制 (0——9 A B C D E F)
硬件中的高低电平(0 和 1表示)所以计算机用 二进制
机器语言就是由 0 和 1 组成的一串组合的语言
字节是计算机里最小的计量单位 1 字节代表 8 个二进制位 (0——255)
2.十进制转换N进制规则:
连除倒取余数
——>2进制 ? 1010
——>2进制 ? 1111
——>2进制 ? 101111
N进制转换为十进制:
2进制换换为10进制 按权求和
= 1*100+2*10+3*1;
——>1*32+0*16+1*8+1*4*+0*2+1*1 = 45;
——>1*128+1*64+0*32+1*8+0*4+1*2+1*1 = ;
10进制转换为8进制
——>8进制 ? 12
——>8进制 ? 17
——>8进制 ? 57
8进制转换十进制
——》1*64+2*8+5*1 = 85
基础知识
//计算机的 数据的存储都是按照二进制的补码的形式进行存储的 // 原码 // 反码 // 补码 // 负数的最高位规定为符号位 1 表示为负数,在参与运算的时候也把符号位考虑进来 // 负数的补码 就是本身除了符号位之外的按位取反再加1 // 正数的补码 就是本身 // 反码 就是按位取反(符号位不变) // 负数的补码 就是本身的反码再加1 //逻辑运算的非 符号 ~ // int a = 5;//0101 ~a 1010 + 1 1110 就是 -6 // printf("%d ",~a); //设断点,看变量的内存位置 //内存的分区 //栈区 堆区 常量区 全局静态区 代码区 //栈区的内存分配原则:从高到底分配,从低到高存取 int a = 5, b = 3; printf("a : %p ",&a);//打印出变量的地址 printf("b : %p ",&b); //获取数据存取的时候的两种方式:1.直接访问(直接呼其名字) 2.间接访问(获取地址,通过地址来操作) //说到地址的时候就是指针 数组的名字就是首地址 int arr[5] = {0}; printf("数组的地址:%p ",&arr[0]); printf("数组的地址:%p ",arr);//数组的名字就是数组的首地址也就是数组第一个元素的内存地址
/* 十进制 10 二进制 0b10 八进制 010 十六进制 0x10 */ int a = 2; int b = 0b10; int c = 0x125; //二进制数修饰符号 0b //八进制数修饰符号 0 //十六进制修饰符号 0x int x = 0b1010; printf("十进制输出x = %d ",x); //八进制输出 printf("八进制输出 x = %O ",x);//是字母的O %O 注意不是0哦 //十六进制输出 printf("十六进制小写的输出x = %0x ",x);//是 %0X 注意是数字的0 不是字母哦 如果0x对应的x要是小写的x则后面输出的A.....则按对应的大小写输出
/*总结格式转换符 %d 整型 %hd 短整型 %ld 长整型 %f 单精度浮点型 %g 省去后面多余的0(浮点型) %lf double型 %c 字符型 %s 字符型 %O 八进制数 %0X 十六进制大写输出 %0x 十六进制小写字母输出 %lu unsingned long 无符号长整型 %p 打印变量的内存地址 注意是小写的p 写成大写的P则不行 */
//交换两个 //^ 位运算符 //通过异或 ^ 交换两个数 //优点:不用第三方变量,避免超出范围 缺点:消耗内存,效率低,速度慢 // int num1 = 2,num2 = 5; // num1 = num1 ^ num2; // num1 = 7 // num2 = num1 ^ num2; // num2 = 2 // num1 = num1 ^ num2; // num1 = 5 // printf("num1 : %d num2 : %d ",num1,num2); //按位与 & 同为 1 就为 1 有一个为 0 就为 0 //按位或 | 同为 0 就为 0 有一个为 1 就为 1 //按位异或 ^ 相同为 0 不同为 1 //左移 << ;向左移动一位 每次左移一位就相当于 原来数字 * 2 //右移 >> ;向右移动一位 每次右移一位就相当于 原来数字 / 2
实战
// int b1 = 0b1011; // int b2 = 0b0110;//改为1001测试 // int result = b1 & b2;//结果为0010 // printf("result = %d ",result); // int b1 = 0b1011; // int b2 = 0b0010;//改为1001测试 // int result = b1 | b2;//结果为0010 // printf("result = %d ",result); // int b1 = 0b1011; // int b2 = 0b0110;//改为1001测试 // int result = b1 ^ b2;//结果为0010 // printf("result = %d ",result); // int b1 = 0b1011; //// int b2 = 0b0110;//改为1001测试 // int res = b1 << 1; //// int result = b1 & b2;//结果为0010 // printf("result = %d ",res ); int a = 0b0100;// 4 int res = a >> 2;//0001 printf("%d ",res); int res1 = res >> 2; printf("%d ",res1); printf("%d ",0b0101 << 1);//左移动后后面空的位置补 0
语句
If(条件表达式){语句块;}这里有可能有陷阱,如果if()后多一个;号 一般很难查找出来 if(条件表达式1){语句块2;}else if(条件表达式2){语句块2}…else{语句块n;} if(条件表达式){语句块1}else{语句块2} while(条件表达式){语句块}//其中条件表达式里面不能够出现像:a = 5的表达式 可以出现判断的语句如:a == 5 for (1.循环变量初始化; 2.循环条件; 3.循环增量) { do { } while(--b) 与 do{}while(b--)的区别 for 循环循环的次数计算 // int i = 0; // //循环次数的计算,( 不满足条件的第一个数 - 循环变量的初始值 )/ 每次循环的增量 // for(i ; i < 200; i = i + 2) 在if()里面的判断语句时候 要把数字写前面 (0 == s)这样万一==写成= 也会报错,方便后面检查。
数组元素在分配地址的时候,是先分配最外层的元素的地址比如 a[5] 来说,先分配 a[4] 的地址,然后a[3]……