1、进制转换
a、十进制转二进制
计算机(物理特性决定的)只能识别二进制
求余法:麻烦但准确率高
求权法:速度快,减法运算准确率要高还要记得每个二进制位上的1所代表的十进制整数
b、二进制转八进制
八进制为了存储记录二进制的
11111111 <=> 0377
每三个二进制位对应一个八进制,最后两位对应一个。
注意:以0开头的数据表示八进制数据
c、二进制转换十六进制
随着计算机的发展,CPU的位数越来越大,八进制不能满足需要,因此我们使用十六进制。
11111111 <=> 0xff
每四个二进制位对应一个十六进制位,大于9的数用字母表示(10:a 11:b 12:c 13:d 14:e 15:f不区分大小写)
注意:以0x开头的数据表示十六进制数据
2、数据在内存中的存储
CPU只能计算加法,所有的计算都通过加法模拟实现的,因此所有的数据需要存储成补码形式才能进制模拟。
注意:数据在内存中是以补码形式存储的。
原码:由十进制转换出的二进制就叫原码
反码:原码按位求反
补码:
正数的原码就是补码
负数的反码+1才是补码
-123 -> 01111011 -> 10000100+1 -> 10000101
注意:补码转换成十进制的过程。
1、必须要知道补码所表示的数据是否有符号
2、如果是有符号补码,根据符号位判断是正数(最高位是0)还是负数(最高位是1)。
10000101-1 -> 10000100 -> 01111011 -> -123
3、位运算符
注意:位运算符是针对补码的运算。
& 补码接位与运算
11001100
10110011
--------
10000000
| 补码接位与运算
11001100
10110011
--------
11111111
^ 补码接位异或运算
11001100
10110011
--------
01111111
~ 补码按位求反运算
~11001100
00110011
00000001
11111110
<< 左移
x << n 把x的补码左移n位,左边的丢弃,右边补0。
11111110 << 3 -> 11110000
11110000 -> 11101111 -> 00010000 -> -16
128+64+32+16 = 240
>> 右移
x >> n 把x的补码右移n位,右边的丢弃,左边补符号位。
11111110 >> 3 11111111
01001100 >> 4 00000100
4、数组
数组:变量的组合,是一种批量定义变量的方式。
一维数组:把变量排成一排。
定义:类型 数组名[数量];
int arr[5] <=> int n1,n2,n3,n4,n5;
初始化:与普通变量一样,默认值不确定,为了安全要进行初始化。
类型 数组名[数量] = {v1,v2,v3,...};
1、初始化数据过多,丢弃多余的数据,并产生警告。
2、始化数据不够则补0,如:int arr[5] = {}。
3、可以省略数组的数量,编译器会统计初始化数据的个数然后告诉数组。
sizeof(arr)/sizeof(arr[0]) 计算数组的长度
使用:数组名[编号]
编译从零开始,范围:0~数量-1。
注意:[]括号中的整数,在定义时表示数量,在使用时表示编号。
遍历:与for循环配合,循环变量当作数组的编号。
int arr[5];
for(int i=0; i<5; i++)
{
printf("%d ",arr[i]);
}
二维数组:把变量排成方阵
定义:类型 数组名[行数][列数];
int arr[3][5];
[][][][][]
[][][][][]
[][][][][]
初始化:类型 数组名[行数][列数] = {
{v1,v2,v3,...},
{v1,v2,v3,...},
{v1,v2,v3,...}};
使用:数组名[行编号][列编号];
遍历:与双层for循环配合,外循环遍历行,内层循环遍历列。
int arr[3][5];
for(int i=0; i<3; i++)
{
for(int j=0; j<5; j++)
{
printf("%d ",arr[i][j]);
}
printf("\n");
}
变长数组:指的是数组的长度在编译时可以不确定,在运行期间决定它长度的变量可以根据实际发生变化,但当执行到数组定义语句时,数组的长度就确定下来了不能再变。
也就是确定数组长度的时间由编译时到执行定义语句时。
int n;
scanf("%d",&);
int arr[n];
优点:可以根据实际情况来确定数组的长度,达到节约内存的目的。
缺点:不能初始化(数组的初始化是由编译器帮助完成的,而编译时变长数组的数量还不确定,因此不能初始化)。
数组的越界问题:
编译器为了执行效率,不会检查数组的下标是否越界,(因此数组的越界从语法解译来说是合法的)。
在使用数组时超出它定义时的范围就叫越界(下标>=数量)。
数组越界的后果:一切正常、段错误、脏数据。