zoukankan      html  css  js  c++  java
  • 数字常量

    数字常量

    shell脚本在默认情况下都是把数字作为10进制数来处理, 除非这个数字采用了特殊的标记或者前缀. 如果数字以0开头的话那么就是8进制数. 如果数字以0x开头的话那么就是16进制数. 如果数字中间嵌入了#的话, 那么就被认为是BASE#NUMBER形式的标记法(有范围和符号限制).

    下面根据具体的实例对这几种表示方法进行深入分析:

    #!/bin/bash
    
    let "dec = 32"
    echo "decimal number = $dec"
    
    let "oct = 032"
    echo "octal number = $oct"
    
    let "hex = 0x32"
    echo "hexadecimal number = $hex"
    
    let "bin = 2#1101"
    echo "banary number = $bin"
    
    let "b32 = 32#77"
    echo "base-32 number = $b32"
    
    let "b64 =64#@_"
    echo "base-64 number = $b64"
    exit 0

    结果:

    root@ubuntu:~/resource/shell-study/0506-2013# ./test6.sh 
    decimal number = 32
    octal number = 26
    hexadecimal number = 50
    banary number = 13
    base-32 number = 231
    base-64 number = 4031
    

    分析:

    1.第一个没有添加如何描述,默认为十进制,32即32

    2.这个数据添加了特殊的前缀“0”,是八进制,032即表示八进制的32,换算的十进制即(3*8的1次方+2*8的0次方),也就是十进制的24+2=26

    3.这个数据添加了特殊的前缀“0x”,是十六进制,0x32即表示十六进制的32,换算的十进制即(3*16的1次方+2*16的0次方),也就是十进制的48+2=50

    4.这个数据是BASE#NUMBER形式,BASE=2,NUMBER=1101,其实就是二进制的意思,1101即表示二进制的1101,换算的十进制即(1*2的3次方+1*2的2次方+0*2的1次方+1*2的0次方),也就是十进制的8+4+0+1=13

    5.这个数据是BASE#NUMBER形式,BASE=32,NUMBER=77,其实就是三十二进制的意思,77即表示三十二进制的77,换算的十进制即(7*32的1次方+7*32的0次方),也就是十进制的224+7=231

    5.这个数据是BASE#NUMBER形式,BASE=64,NUMBER=@_,其实就是六十四进制的意思,@_即表示三十二进制的@_,这里重点说明一下,在这个六十四进制中每组包括64位,即0-63,0-9即用0-9表示,但是后面的数字都是两位数,所以shell就给出了一种简单的方法来取代这些两位数,10-35这26个位就依次用26个小写字母表示(依次为a-z),36-61这26个位就依次用26个大写字母表示(依次为A-Z),最后还剩下62和63这两个位,聪明的shell于是就用“@”表示62,用“_”表示62,所以也就有了上面的方法了,所以换算成十进制就是62*64的1次方+63*64的0次方,即3968+63=4031

    重要的注意事项:
    使用一个超出给定进制的数字的话,,将会引起一个错误.

    root@ubuntu:~/resource/shell-study/0506-2013# let "val = 081"
    bash: let: val = 081: value too great for base (error token is "081")
    

    提示数值过大,即八进制每位的最大值是7,而上面第二位却是8,所以提示错误

    到现在看来,其实用八进制,十六进制完全可以不在使用“0”“0x”来表示了,完全可以全部用BASE#NUMBER形式取代,下面做一个下测试验证:

    root@ubuntu:~/resource/shell-study/0506-2013# let "val = 8#32"
    root@ubuntu:~/resource/shell-study/0506-2013# echo $val
    26
    root@ubuntu:~/resource/shell-study/0506-2013# let "val = 16#32"
    root@ubuntu:~/resource/shell-study/0506-2013# echo $val
    50
    root@ubuntu:~/resource/shell-study/0506-2013# 

    结果和上面的结果是一致的

    待续。。。。。。

  • 相关阅读:
    MYSQL架构和Innodb存储引擎
    MySQL基础
    ConcurrentHashMap
    线程池
    并发包(JUC)之阻塞队列
    并发包(JUC)之Condition、CountDownLatch
    并发包(JUC)之Lock和AQS
    volatile关键字——数据可见性问题
    对象锁——synchronized关键字
    获取ip
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3063446.html
Copyright © 2011-2022 走看看