Chinaunix首页 | 论坛 | 博客
  • 博客访问: 749537
  • 博文数量: 176
  • 博客积分: 2548
  • 博客等级: 少校
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-29 16:36
个人简介

爱咋咋地

文章分类

全部博文(176)

文章存档

2024年(1)

2023年(17)

2022年(19)

2021年(3)

2020年(1)

2018年(1)

2017年(1)

2014年(1)

2013年(4)

2012年(11)

2011年(19)

2010年(22)

2009年(71)

2008年(5)

分类: LINUX

2013-03-13 14:12:03

想计算一个数值,使用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.


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





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