操作符详解

简介: 操作符详解

一、进制转换

  • 在计算机常见计算形式中,我们经常见到的二进制、八进制、十进制和十六进制都是数值的常见的表现形式。

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函数调用

函数调用符:

函数名();

相关文章
|
11月前
|
编译器 C语言 索引
操作符详解下(非常详细)
操作符详解下(非常详细)
36 0
|
2月前
|
SQL 数据库
IN 操作符
【7月更文挑战第15天】IN 操作符。
27 4
|
2月前
|
SQL 数据库
BETWEEN 操作符
【7月更文挑战第15天】BETWEEN 操作符。
28 3
|
3月前
|
编译器 C语言
操作符详解(1)
操作符详解(1)
25 0
|
4月前
|
编译器 C语言 C++
操作符详解2(二)
本文介绍了编程中的操作符转换和表达式解析规则。当操作数类型不同时,会进行寻常算术转换,按照long double、double、float等类型顺序进行向上转换。表达式求值时,虽然操作符有优先级,但不能决定操作数的求值顺序,例如`a*b + c*d + e+f`中乘法先于加法,但具体计算顺序不确定,可能导致不同结果。同样,如`c++ + c--`这样的表达式也是有歧义的,因为++和--的左右结合性不能确定操作数的获取顺序。文章强调,复杂的表达式可能因编译器差异产生不同结果,应避免使用可能导致非唯一计算路径的表达式以减少潜在风险。
32 0
|
编译器 C语言 索引
S5——C操作符详解,你都知道吗? 下
讲解主要内容: 1. 各种操作符的介绍 2. 表达式求值 以下让我们开始正式重新认识和理解操作符吧!
|
编译器
详解操作符(下)
详解操作符(下)
|
SQL
LIKE操作符
LIKE操作符
76 0
|
存储 编译器 C语言