本篇文章主要讲的是二进制和进制转换、原码、反码、补码、操作符的属性:优先级、结合性这几个使用操作符的时候需要了解的一些简单的基础知识。
1.二进制和进制转换
在使用计算机时,我们可能会经常看到或听到2进制、8进制、10进制、16进制等等,这是什么意思呢?其实这就是数值的不同表示形式。
我们日常生活使用的就是10进制,例如7、16这种就是10进制了。
比如我们生活中的周就是一个进制,7天为1周,即7进制,满7进1.当然还有24小时为1天…
来看看数值15的各种进制的表⽰形式:
15的2进制:1111
15的8进制:17
15的10进制:15
15的16进制:F
我们平时的生活中使用的10进制是怎么样的呢?
一、10进制中满10进1
二、10进制的数字每⼀位都是0~9的数字组成
那么,二进制也是类似的
一、2进制中满2进1
二、2进制的数字每⼀位都是0~1的数字组成
上面的例子中1111就是表示十进制数值15的二进制表示形式啦
要想知道这些进制是如何表示数值的,我们需要知道几个概念。
位、权重。权重值。
下图就是数值123是如何用10进制表示的:
既然我们知道了10进制,那么就能知道2进制,2进制和10进制是类似的,只不过2进制的每⼀位的权重,从右向左是: 2^0 , 2^1 , 2^2 …
那么2进制的1101怎么理解呢?
10进制转2进制
这个怎么转换呢?
如下图:
由下往上依次所得的余数就是10进制所转化成的2进制表示形式
上图就是10进制的125转换为2进制:01111101
其实 我们想对一些较小的10进制值快速转换的话可以通过记2进制的权重值的方式来完成。
我们已经知道2的权重值由右到左依次为1 、2 、 4 、 8 …
10进制的5,就由1和4相加而成,所以2进制为0101
10进制的6,就由2和4相加而成,所以2进制为0110
2进制转8进制
由于8进制是满8进1,所以8进制的每一位最多由2进制的3位就可以组成,2进制111的值为1+2+4=7.
所以2进制转8进制的方式就是从右往左,每3个2进制位来表示1个8进制位。
如下图:
2进制转16进制
16进制是满16进1,那么当一个值大于9时,怎么用1个位来表示这些大于9的值呢?
那么就规定了用a~f 分别表示10~15 。
例如 a就表示10
和2进制转8进制类似,只不过16进制的一个位需要2进制的4个位来表示。
2.原码、反码、补码
整数的2进制表⽰⽅法有三种,即原码、反码和补码
有符号整数的三种表⽰⽅法均有符号位和数值位两部分,在2进制序列中,最⾼位的1位是被当做符号位,剩余的都是数值位,并且符号位是用0表示“正”,用1表示“负”。
正整数的原、反、补码都相同。
负整数的三种表示方法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。
当然 我们也可以用补码得到原码 使用:取反、+1的操作
下面来举个例子:
假设int n = -1;
则-1的原码为:10000000000000000000000000000001
反码为符号位不变,其它取反:11111111111111111111111111111110
补码为反码+1:11111111111111111111111111111111
所以-1的补码就是11111111111111111111111111111111
接着我们使用补码来求原码
补码:11111111111111111111111111111111
补码取反:10000000000000000000000000000000
+1:10000000000000000000000000000001
这样就得到原码:10000000000000000000000000000001
注意取反操作的符号位是不变的
为什么要知道补码呢?因为对于整形来说:数据存放内存中其实存放的是补码。
3.操作符的属性:优先级、结合性
C语⾔的操作符有2个重要的属性:优先级、结合性,这两个属性决定了表达式求值的计算顺序
3.1优先级
优先级指的是,如果⼀个表达式包含多个运算符,哪个运算符应该优先执⾏。各种运算符的优先级是不⼀样的。
例如:
3 + 4 * 5;
上⾯⽰例中,表达式 3 + 4 * 5 ⾥⾯既有加法运算符( + ),⼜有乘法运算符( * )。由于乘法的优先级⾼于加法,所以会先计算 4 * 5 ,⽽不是先计算 3 + 4。
3.2结合性
如果两个运算符优先级相同,优先级没办法确定先计算哪个了,这时候就看结合性了。
即根据运算符是左结合,还是右结合,决定执⾏顺序。⼤部分运算符是左结合(从左到右执⾏),少数运算符是右结合(从右到左执⾏),⽐如赋值运算符( = )。
5 * 6 / 2;
上⾯⽰例中, * 和 / 的优先级相同,它们都是左结合运算符,所以从左到右执⾏,先计算 5 * 6 ,再计算 6 / 2 。
主要可以记住以下操作符的优先级
从上往下优先级从高到低
圆括号( () )
⾃增运算符( ++ ),⾃减运算符( – )
单⽬运算符( + 和 - )
乘法( * ),除法( / )
加法( + ),减法( - )
关系运算符( < 、 > 等)
赋值运算符( = )
由于圆括号的优先级最⾼,可以使⽤它改变其他运算符的优先级。
下面这个是完整的操作符的优先级表
参考链接可以点此进入
上面的内容不完整,等晚点再把剩下的一些内容补充完整