操作符详解

简介: 操作符详解

一、进制转换

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

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

函数调用符:

函数名();

相关文章
|
8月前
|
存储 C++
C/C++中位操作符(&,|,^,~)的详解使用
C/C++中位操作符(&,|,^,~)的详解使用
|
存储 索引
【操作符】
【操作符】
47 0
|
6月前
|
SQL 数据库
IN 操作符
【7月更文挑战第15天】IN 操作符。
49 4
|
7月前
|
编译器 Linux C语言
操作符详解(2)
操作符详解(2)
56 0
|
7月前
|
索引
操作符,详细讲解
操作符,详细讲解
|
8月前
|
存储 程序员 C语言
操作符详解1(二)
该内容是一个关于C语言操作符和结构体的教程摘要。首先提到了加法操作符`+`的使用,并给出了一种不使用临时变量交换两个数的方法。接着讨论了如何计算整数的二进制表示中1的个数,通过位操作符实现。然后介绍了逗号表达式和函数调用操作符`()`,以及结构体成员访问操作符`.`和`-&gt;`,用于访问和修改结构体内的成员变量。文章以讲解结构体的声明、初始化和通过指针访问结构体成员为重点,展示了如何直接和间接地操作结构体数据。
59 0
|
存储 编译器
操作符详解(1)
操作符详解(1)
48 0
操作符详解(一)
操作符详解(一)
87 0
|
存储 编译器 C语言
7.27C语言知识点之操作符
7.27C语言知识点之操作符
68 0
|
SQL
NOT操作符
NOT操作符
78 0