Bootstrap

shell小练习

目录

1、计算10的阶乘

2、12,-13的原码,补码和反码

2.1、何为原码

2.2、何为补码

 2.3、何为反码

 了解完之后我们来看12,-13的原码、补码和反码

3、计算 1+2的结果,并将值赋给变量data, 然后计算 data+10的值,赋值给data2

3.1、(())

3.2、let

3.3、expr

3.4、bc

3.5、$[]


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
;