目录
3、计算 1+2的结果,并将值赋给变量data, 然后计算 data+10的值,赋值给data2
1、计算10的阶乘
[root@node1 zy]# seq -s '*' 10 | bc # 计算任意数,修改10为任意数即可
3628800
2、12,-13的原码,补码和反码
2.1、何为原码
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值,例如的十进制的的正负1,用8位二进制的原码表示如下:
【+1】= 原:[ 0000 0001 ]
【-1】= 原:[ 1000 0001 ]
机器数:一个数在计算机的存储形式是二进制数,我们称这些二进制数为机器数,机器数是有符号,在计算机中用机器数的最高位存放符号位,0表示正数,1表示负数
真值:因为机器数带有符号位,所以机器数的形式值不等于其真实表示的值(真值),以机器数1000 0001为例,其真正表示的值(首位为符号位)为-1,而形式值(首位就是代表1)为129;因此将带符号的机器数的真正表示的值称为机器数的真值。
2.2、何为补码
补码的表示方法为:
- 正数的补码是其原码本身。
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反后加1(即在反码的基础上加1)
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ] = 补:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ] = 补:[ 1111 1111 ]
2.3、何为反码
反码的表示方法为:
- 正数的反码是其原码本身。
- 负数的反码是在其原码的基础上,符号位不变,其余各位取反
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ]
了解完之后我们来看12,-13的原码、补码和反码
12
原码:0000 1100
补码:0000 1100
反码:0000 1100
-13
原码:1000 1101
补码:1111 0011
反码:1111 0010
3、计算 1+2的结果,并将值赋给变量data, 然后计算 data+10的值,赋值给data2
(要求:分别使用(()), let, exp,bc和 $[]实现)
3.1、(())
用于整数运算,在(())里面可以省略变量的$符号
[root@node1 zy]# ((data=1+2))
[root@node1 zy]# echo $data
3
[root@node1 zy]# ((data2=data+10))
[root@node1 zy]# echo $data2
13
3.2、let
用于整数运算,可以执行多个表达式,变量的$符号不可省略
[root@node1 zy]# let data2=$data+10
[root@node1 zy]# echo $data2
13
3.3、expr
不止可以用于整数运算,使用expr时,运算符及用于计算的数字左右都至少有一个空格,否则报错;使用乘号,必须使用反斜线屏蔽其特定含义;使用expr做 计算,将一个未知的变量和一个已知的整数相加,看返回码是否为 0,如果为0就认为做加法的变量为整数,否则就不是整数
[root@node1 zy]# data2=`expr $data + 10`
[root@node1 zy]# echo $data2
13
3.4、bc
可以计算小数,相当于Linux中的计算器
[root@node1 zy]# data2=`echo $data+10 | bc`
[root@node1 zy]# data=`echo 1+2 | bc`
[root@node1 zy]# data2=`echo $data+10 | bc`
[root@node1 zy]# echo $data
3
[root@node1 zy]# echo $data2
13
3.5、$[]
用于整数运算
[root@node1 zy]# data=$[1+2]
[root@node1 zy]# data2=$[$data+10]
[root@node1 zy]# echo $data
3
[root@node1 zy]# echo $data2
13