Chinaunix首页 | 论坛 | 博客
  • 博客访问: 86870
  • 博文数量: 31
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 11
  • 用 户 组: 普通用户
  • 注册时间: 2014-10-23 00:16
文章分类
文章存档

2015年(13)

2014年(18)

我的朋友

分类: LINUX

2015-04-08 12:03:28

想计算一个数值,使用bc 可以使用 echo " xxx+yyy"|bc 这样来用
$echo "111+222"|bc
333
$

如果输入的是16进制数字的话可以使用ibase参数来设置:
$echo "ibase=16;111+222"|bc
819
$

如果想让输出也显示16进制怎么办哪,一般人会想当然的设置obase参数,如下:
$echo "ibase=16; obase=16; 111+222"|bc
怎么样?!!如果你也是这样想的话,你也我和一样掉坑里面了。看下输出是啥
$echo "ibase=16; obase=16; 111+222"|bc
 01 15 05
$

kao,
so tmd why???? 应该显示333啊

后来在测试中发现如果把 obase放在ibase前面的话就正常了:
$echo "obase=16; ibase=16; 111+222"|bc
333
$

这又是so tmd why? 难道是bug,我当时也是这么想的.

但在google之 之后,发现我们现在有时还是 too young,too simple, sometimes naive.
bc 在gnu世界这么多年如果还存在这种bug的话也太那个啦!

还是个神圣的地方,啥问题都有人回答。
/questions/9889839/bc-and-its-ibase-obase-options 参看这个链接。

原来ibase如果放在最前面的话,后面所有的输入都回被认为是16进制的,包括obase,所以上面ibase=16;
obase=16 中的obase其实被设置为了10 进制中的22,而bc在obase大于16以后就会用多字节表示:
1*22*22+15*22+5 = 819 一点错都没有。

总之,一句话先设置obase,在设置ibase就没错。


好吧,我承认自己naive!

(另外stackoverflow.com上面提到的是另外一个坑:
         For multi-digit numbers, bc changes all input digits greater or equal to ibase to the value of ibase-1.


发篇博文,提醒同道, “坑贫道不坑道友” !!!!





阅读(1510) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~