一、进制转换
- 在计算机常见计算形式中,我们经常见到的二进制、八进制、十进制和十六进制都是数值的常见的表现形式。
1.1 二进制
1.1.1 二进制详解
- 二进制和十进制一样,都是数值的表现形式,在理解二进制时可以借鉴一下十进制。
在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。
则在二进制中:
十进制中每一位都是由0-1组成。
十进制的每一位满2进1。
1.1.2 十进制转换二进制
- 这样我们就可以清楚的知道简单的数字的二进制表现形式。
十进制:10
二进制:1010
- 如果遇到复杂的十进制转换二进制,我们可以采用除2求余的方法。
十进制:1234
二进制:10011010010
1234除以2等于617余0
617除以2等于308余1
308除以2等于154余0
154除以2等于77余0
77除以2等于38余1
38除以2等于19余0
19除以2等于9余1
9除以2等于4余1
4除以2等于2余0
2除以2等于1余0
1除以2等于0余1
由下往上所得余数为二进制
1.1.3 二进制转换十进制
- 可以利用上面的例子,可以采用从最右面乘以2的0次方向左加一个次方的方法,将二进制准换为十进制。
二进制:10011010010
十进制:1234
0乘以2的0次方+(0)
1乘以2的1次方+(2)
0乘以2的2次方+(0)
0乘以2的3次方+(0)
1乘以2的4次方+(16)
0乘以2的5次方+(0)
1乘以2的6次方+(64)
1乘以2的7次方+(128)
0乘以2的8次方+(0)
0乘以2的9次方+(0)
1乘以2的10次方+(1024)
结果为:1024+128+64+16+2=1234
1.2 八进制
1.2.1 八进制详解
- 八进制和二进制的转化十进制的方式相同,都是数值的表现形式,在理解八进制时可以借鉴一下二进制转换十进制。
在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。
则在二进制中:
十进制中每一位都是由0-2组成。
十进制的每一位满2进1。
则在八进制中:
十进制中每一位都是由0-7组成。
十进制的每一位满8进1。
1.2.2 十进制转换八进制
- 这样我们就可以清楚的知道简单的数字的八进制表现形式。
十进制:10
二进制:1010
八进制:12
- 如果遇到复杂的十进制转换八进制,我们可以采用除8求余的方法。
十进制:1234
二进制:10011010010
八进制:2322
1234除以8等于154余2
154除以8等于19余2
19除以8等于2余3
2除以8等于0余2
十进制转八进制:由下往上所得余数为八进制
1.2.3 八进制转换十进制
- 可以利用上面的例子,可以采用从最右面乘以8的0次方向左加一个次方的方法,将八进制准换为十进制。
八进制:2322
十进制:1234
2乘以8的0次方+(2)
2乘以8的1次方+(16)
3乘以8的2次方+(192)
2乘以8的3次方+(1024)
结果为:1024+192+16+2=1234
1.2.4 八进制转换二进制
- 由于八进制的每一位是由0-7组成,而二进制的每三位的和也是八进制,那么2进制和八进制之间也是可以很好的准换的。
二进制:10 011 010 010
八进制:2 3 2 2
计算方法:同求十进制一样,由于每三位二进制的数和为7,所以不用担心溢出。
1.3 十六进制
1.3.1 十六进制详解
- 十六i进制、八进制和二进制的转化十进制的方式相同,都是数值的表现形式,在理解八进制时可以借鉴一下二进制转换十进制。
在十进制中:
十进制中每一位都是由0-9组成。
十进制的每一位满10进1。
则在十六进制中:
十进制中每一位都是由0-F组成。
这里ABCDEF分别表示10、11、12、13、14、15
十进制的每一位满16进1。
1.3.2 十进制转换十六进制
- 这样我们就可以清楚的知道简单的数字的十六进制表现形式。
十进制:30
十六进制:1E
- 如果遇到复杂的十进制转换十六进制,我们可以采用除16求余的方法。
十进制:1234
二进制:10011010010
八进制:2322
十六进制:4D2
1234除以16等于77余2
77除以16等于4余D
4除以16等于0余4
十进制转十六进制:由下往上所得余数为十六进制
1.3.3 十六进制转换十进制
- 可以利用上面的例子,可以采用从最右面乘以16的0次方向左加一个次方的方法,将十六进制准换为十进制。
十六进制:4D2
八进制:2322
二进制:10011010010
十进制:1234
2乘以16的0次方+(2)
13乘以16的1次方+(208)
4乘以16的2次方+(1024)
结果为:1024+207+2=1234
1.3.4 十六进制转换二进制
- 由于十六进制的每一位是由0-F组成,而二进制的每四位的和也是十六进制,那么2进制和十六进制之间也是可以很好的准换的。
二进制:100 1101 0010
十六进制:4 D 2
计算方法:同求十进制一样,由于每四位二进制的数和为F,所以不用担心溢出。
二、二进制的表示方式
- 整数的二进制的表示方式有三种:原码、反码和补码。
- 正整数的原码、反码和补码相同,而负整数原码、反码和补码不同。
2.1 原码
- 直接将数值按照正负值的形式翻译成二进制得到的就是原码。
int a = 11; //原码:00000000 00000000 00000000 00001011 int b = -11; //原码:10000000 00000000 00000000 00001011
1.这里需要提示一下,在有符号整数中,原码、反码和补码均有符号位和数值位。
2.符号位,即原码、反码和补码的第一位,0表示正整数,1表示负整数。
3.数值位,即除去原码、反码和补码的第一位,其他的位。
4.而无符号整数,只有数值位,没有符号位。
2.2 反码
- 原码的符号位不变,将其他数值位取反得到数值位。
int a = 11; //原码:00000000 00000000 00000000 00001011 //反码:00000000 00000000 00000000 00001011 int b = -11; //原码:10000000 00000000 00000000 00001011 //反码:11111111 11111111 11111111 11110100
2.3 补码
- 反码加1得到补码。
int a = 11; //原码:00000000 00000000 00000000 00001011 //反码:00000000 00000000 00000000 00001011 //补码:00000000 00000000 00000000 00001011 int b = -11; //原码:10000000 00000000 00000000 00001011 //反码:11111111 11111111 11111111 11110100 //补码:11111111 11111111 11111111 11110101
在计算器中,数值都是用补码储存。是因为计算器在使用补码时可以将符号位和数值位统一处理。
2.4 从补码到原码
- 补码到原码不仅仅可以通过退一步到反码,再退一步到原码的方式。也可以通过补码取反,再加一的方式。
int a = 11; //原码:00000000 00000000 00000000 00001011 //反码:00000000 00000000 00000000 00001011 //补码:00000000 00000000 00000000 00001011 int b = -11; //原码:10000000 00000000 00000000 00001011 //反码:11111111 11111111 11111111 11110100 //补码:11111111 11111111 11111111 11110101 //取反:10000000 00000000 00000000 00001010 //加一:10000000 00000000 00000000 00001011
三、操作符
3.1 算术操作符
+加
-减
*乘
/除
%取模
3.2 移位操作符
3.2.1 左移操作符
左移操作符:<<
- 了解二进制的表示方式后,左移操作符是将符号位不变,左边丢弃,右边补零。
int num = 10; //原码=反码=补码 //00000000 00000000 00000000 00001010 int n = num<<1; //00000000 00000000 00000000 00010100
3.2.1 右移操作符
右移操作符:>>
- 右移操作符分俩种情况:逻辑右移,算数右移。
int num = -10; //原码:10000000 00000000 00000000 00001010 //反码:11111111 11111111 11111111 11110101 //补码:11111111 11111111 11111111 11110110
- 逻辑右移:左边用0填充,右边丢弃
int num = -10; //原码:10000000 00000000 00000000 00001010 //反码:11111111 11111111 11111111 11110101 //补码:11111111 11111111 11111111 11110110 int n = num>>1; //右移:01111111 11111111 11111111 11111011 //此时右移后的码为补码,是再计算机储存的码 //取反:00000000 00000000 00000000 00000100 //原码:00000000 00000000 00000000 00000101 printf("%d",n);//n = 5
- 算数右移:左边使用原来的符号位,右边丢弃
int num = -10; //原码:10000000 00000000 00000000 00001010 //反码:11111111 11111111 11111111 11110101 //补码:11111111 11111111 11111111 11110110 int n = num>>1; //右移:11111111 11111111 11111111 11111011 //此时右移后的码为补码,是再计算机储存的码 //取反:10000000 00000000 00000000 00000100 //原码:10000000 00000000 00000000 00000101 printf("%d",n);//n = -5
逻辑右移和算数右移取决于编译器的不同。
3.3 位操作符
位操作符有三种:
按位与 &、按位或 |、按位异或 ^
使用时必须位整数。
3.3.1 按位与 &
- 按二进制与 &,对应的二进制位有0,则为0;俩个同时为1,则为1.
int num1 = 10; //补码:00000000 00000000 00000000 00001010 int num2 = 6; //补码:00000000 00000000 00000000 00000110 int n = num1 & num2; //补码:00000000 00000000 00000000 00000010 //原码:00000000 00000000 00000000 00000010 printf("%d",n); //n = 2
3.3.2 按位或 |
- 按二进制或 |,对应的二进制位有1,则为1;俩个同时为0,则为0.
int num1 = 10; //补码:00000000 00000000 00000000 00001010 int num2 = 6; //补码:00000000 00000000 00000000 00000110 int n = num1 | num2; //补码:00000000 00000000 00000000 00001110 //原码:00000000 00000000 00000000 00001110 printf("%d",n); //n = 14
3.3.3 按位异或
- 按二进制异或 ^,对应的二进制位相同为0,相异为1.
int num1 = 10; //补码:00000000 00000000 00000000 00001010 int num2 = 6; //补码:00000000 00000000 00000000 00000110 int n = num1 ^ num2; //补码:00000000 00000000 00000000 00001100 //原码: printf("%d",n); //n = 12
按位异或特点:
1.a^a=0;
2.0^a=a;
3.异或 ^支持交换律
3.4 赋值操作符
赋值操作符:
=、+=、-=、/=、%=、<<=、>>=、&=、|=、^=
3.5 单目操作符
单目操作符:
!逻辑反
-负值
+正值
&取地址
sizeof操作数类型长度
~二进制按位取反
–前置、后置减减
++前置、后置加加
*间接访问操作符(解引用操作符)
()强制类型转换
3.6 关系操作符
关系操作符:
< 小于、>大于
<=小于等于、>=、
==等于、!=不相等
3.7 逻辑操作符
逻辑操作符:
&& 逻辑与
|| 逻辑或
3.8 条件操作符
条件操作符:
exp1?exp2:exp3
3.8 逗号表达式
逗号表达式:
exp1,exp2,exp3…expn
3.9 下标引用
下标引用符:
数组[];
3.10函数调用
函数调用符:
函数名();