《shell脚本学习指南》6.1.3节描述了shell的算术展开,其支持的运算与C语言差很少,语法
$((...))
shell
$ echo $(( 3 * 4 )) 12
在某些场景特别方便,能够免去写程序的烦琐,如验证某些运算。
下面是验证《深刻理解计算系统》练习题2.12的场景
表达式 ~0 将生成一个全1的掩码,无论机器的字大小是多少,可移植。
bash
$ printf "%x\n" $(( ~0 )) ffffffffffffffff $ printf "%#x\n" $(( ~0 )) 0xffffffffffffffff
$ printf "%#x\n" $(( 0x89ABCDEF & 0xFF )) 0xef $ printf "%#.8x\n" $(( 0x89ABCDEF & 0xFF )) 0x000000ef
$ printf "%#.8x\n" $(( 0x87654321 & 0xFF )) 0x00000021 $ printf "%#.8x\n" $(( 0x87654321 & ?0xFF )) -bash: 0x87654321 & ?0xFF : syntax error: operand expected (error token is "?0xFF ")书中给出的练习题的答案是 “x & ?0xFF”,这里的"?"号经验证,shell没法正确运行。
$ printf "%#x" $(( 0x87654321 ^ ~0xff)) 0xffffffff789abc21
C.x的最低有效字节设置成全1,其余字节都保持不变。ide
$ printf "%#x" $(( 0x87654321 | 0xff )) 0x876543ff