zl程序教程

您现在的位置是:首页 >  其他

当前栏目

C语言基础——(3)进制表示、操作符介绍

2023-03-14 22:42:35 时间


计算机数据进制的变换


二进制


二进制表示其实就是在计算机中真实保存的数据状态,一个字节分成八段,每段可以用来记录一个0 或者1,要想把一个数字记录在一个字节里必须首先把这个数字拆分成八个0或者1,采用一组0或者1表示数字的方法叫做二进制。

任何数字都可以采用十进制方式表示也可以采用二进制方式表示,计算机里只能用二进制方式记录数字。

二进制中每个数位有一个编号,最右边数位的编号是0,向左依次递增;

二进制表示方式中某个数位上的1单独代表的数字可以采用2的数位编号次方计算;

二进制表示方式中如果相邻两个数位的内容一样则左边数位代表的数字是右边数位代表数字的2倍;

以上规则只适用于二进制表示的非负数。

二进制加一的计算规则是把编号为0位置开始的连续多个1都变成0,把最右边的0变成1


二进制表示的非负数转换成十进制的时候只需要把每个1单独转换然后把转换结果求和:


0000 0101 = 2的2次方 + 2的0次方

= 4 + 1

= 5


0010 0100 = 2的5次方 + 2的2次方

= 32 + 4

= 36


非负数表示的十进制转换成二进制的方法

** ***0 12

** **0 6

** *1 3

** 1 1

** 0


转换结果是0000 1100


不停对数字做除以2保留整数部分的操作得到一组数字,对每个数字做除以2取余的操作得到一个数位的内容。把所有数位内容按照从后向前的顺序书写就得到转换结果。


负数的二进制和十进制之间不能直接转换, 需要借助它们的相反数。

转换过程分三步,首先计算相反数,然后把这个相反数进行转换,最后根据转换结果再计算相反数。


把二进制中每个数位的内容变成相反数然后再加一就得到相反数的二进制。


-14

14

0000 1110

1111 0001 + 1 = 1111 0010(-14的二进制)


有符号类型二进制最左边的数位叫做符号位,根据它可以知道数字的正负。符号位是0表示非负数,符号位是1表示负数。


1100 0101

0011 1010 + 1 = 0011 1011

59

-59


八进制


把二进制表示方式中从右向左每三个数位分成一组,每组用一个0到7之间的数字替换。这个替换结果就叫做数字的八进制表示方式。

例如:

0110 1010

01 101 010 =====》 152(八进制)

可以在程序中直接使用八进制方式表示数字,但是必须以0作为数字开头。可以采用 %o 作为占位符把数字的八进制表示方式显示到屏幕上。

把数字的八进制表示方式显示到屏幕上。

printf("%d   0%o
",  0152, 0152);


这段代码前面显示152(八进制)的十进制表示(106),后面就是以八进制表示方法显示到屏幕上的0152。


十六进制


把二进制的所有数位从右向左每四个数位分成一组,每组用一个字符替换。用 a 到 f 的六个字符替换10到15之间的六个数字。

例如:


1100 1011

c b

可以在程序中使用十六进制方式表示数字,这个时候必须用0x作为开头,可以采用 %x 或者 %X 作为占位符把数字的十六进制表示方式显示到屏幕上。显示结果里不包含0x开头。如果采用 %x 则显示结果中所有英文字符都是小写的;而采用 %X 则显示结果中所有英文字符都是大写的。


操作符


操作符用来表示对数字的计算规则,操作符分成单目操作符,双目操作符,三目操作

符。

加减乘除都是双目操作符(*代表乘法,/代表除法);参与除法计算的两个数字如果都是整数则计算结果只保留整数部分;


采用 % 操作符表示取余操作

赋值操作符用 = 表示

赋值语句可以当做数字使用,这个数字就是赋值完成后存储区里的数字,可以在一条语句中使用多个赋值操作符,这个时候应该优先计算右边的赋值操作符。


绝大多数双目操作符都可以和赋值操作符复合合并成复合赋值操作符(例如 += , *= )

复合赋值操作符要求左边是一个存储区,右边是一个数字,复合赋值操作符首先把左右两边的内容用双目操作符进行计算,然后把计算结果记录到左边的存储区中。复合赋值操作符的优先级和赋值操作符的优先级一样低


自增操作符(++)和自减操作符(–)

自增操作符(++)和自减操作符(–)都是单目操作符。它们都只能和存储区配合使用,它们可以把存储区的内容做加一或减一操作。它们各有两种使用方法,一种是前操作(操作符写在存储区前面),另外一种就是后操作(操作符写在存储区后面)

例如:

inr  num;
num++;//后操作自加
++num;//自增前操作
num--;//自减后操作
--num;//自减前操作


自增或自减操作符编写的表达式可以当做数字使用,前操作当数字使用的时候是修改后的数字,后操作当数字使用的时候是修改前的数字。

不要在一条语句里对同一个变量多次进行自增或者自减计算,因为这样做会使结果不确定


逻辑操作符

逻辑操作符用来编写逻辑表达式,逻辑表达式的结果只能是布尔值。


!逻辑操作符

!是一个单目逻辑操作符,它可以计算一个布尔值的相反值,(求反),这个操作符使用的时候要写在一个布尔值的前面。


双目逻辑操作符

在逻辑操作符中有很多双目逻辑操作符,包括 ==(等于), !=(不等于),>(大于),<(小于),>=(大于等于),<=(小于等于)


简单逻辑表达式中最多只包含一个双目逻辑操作符,简单逻辑表达式在计算机中和在数学里的结果一定一样。

程序中复杂的逻辑表达式必须拆分成多个简单逻辑表达式然后再合并。

可以使用与(&&)和或(||)这两个双目逻辑操作符合并两个逻辑表达式。

如果两个逻辑表达式中有一个结果是真则用或(||)合并后结果就是真;

如果两个逻辑表达式中有一个结果是假则用与(&&)合并后结果就是假。

与(&&)和或(||)都具有短路特征

如果前面逻辑表达式的结果可以决定整个逻辑表达式的结果则计算机会忽略后面的逻辑表达式。

例如:

int num = 0;
1||++num;
printf("num是%d
", num);


因为1决定了或运算的结果,所以后面的自增操作不会进行,所以这段代码的结果输出还是 num是0 。


位操作符


位操作符可以直接操作二进制数位。


~位操作符


~是一个单目位操作符,它可以把一个二进制数字中每个数位求反(按位求反)。这个操作符使用的时候应该写在一个数字的前面。


双目位操作符


双目位操作符包括按位与(&),按位或(|)和按位异或(^),它们可以把两个数字对应的二进制位上的内容做计算;按位与可以把对应数位上的内容做与计算;按位或可以把对应数位上的内容做或计算。

例如:

3 ——>0000 0011

&

5 ——>0000 0101

结果—>0000 0001


3 ——>0000 0011

|

5 ——>0000 0101

结果—>0000 0111


按位异或可以把对应数位的内容做异或计算,如果对应数位内容一样则异或结果就是0,如果对应数位内容不一样则异或结果就是1:

3 ——>0000 0011

^

5 ——>0000 0101

结果—>0000 0110


移位操作符


移位操作符可以把二进制数字中每个数位里的数字统一向左或者向右移动 n 个位置。


<<表示向右移位操作符;>>表示向左移位操作符

它们都是双目位操作符,操作符左边的数字表示将要进行移位操作符的数字,操作符右边的数字表示将要移动的位数。移位操作可以把每个数位的内容移动到另一个数位里。

在左移的时候右边空出来的数位上一定填充0;右移的时候左边空出来的数位上一定填充符号位。

一般情况下吧数字左移动 n 位相当于乘以2的 n 次方;向右移动 n 位相当于除以2的 n 次方。

所有位操作符不会修改存储区内容,只会计算出一个新数字


&也可以作为单目操作符使用,它可以用来计算出一个存储区的地址,叫做取地址操作。这个操作符使用的时候应该放在一个存储区的前面。

可以使用 %p 作为占位符把地址数据显示到屏幕上,在我们使用的计算机里所有地址数据都占32个二进制数位。


*也可以作为单目操作符使用,这个时候它可以根据一个地址找到来源的存储区,使用的时候应该写在一个地址数据的前面。


三目操作符


三目操作符可以从两套计算规则中选择一套进行计算,三目操作符的格式如下:

布尔值 ? 公式一 : 公式二

如果布尔值是真就选择公式一进行计算,否则选择公式二进行计算。

使用三目表达式的时候不要在问好后使用赋值操作符