Ubuntu中使用bc转换非法十六进制值未抛出错误问题咨询
原因分析
- 这是GNU bc工具的默认非严格兼容特性导致的:当你通过
ibase指定输入基数后,如果输入的数字位对应的数值大于等于ibase,GNU bc默认不会抛出错误,而是自动将该位的值截断为ibase - 1。 - 你设置了
ibase=16,合法的十六进制位最大值为15(对应字符F),输入的Z对应数值远大于16,因此每一位Z都会被自动替换为15(即F)。五个Z等价于十六进制值FFFFF,转换为十进制是1048575,再转成八进制刚好就是你得到的3777777,与执行结果完全吻合。
启用错误提示的方法
如果需要bc对非法输入抛出报错,可以使用如下两个参数启动bc:
-s:严格遵循POSIX bc标准,非法输入直接报错-w:对非POSIX兼容的输入行为抛出警告
示例命令:
echo 'ibase=16; obase=8; ZZZZZ' | bc -w
执行后会输出类似(standard_in) 1: illegal digit: Z的错误提示,符合预期。
内容的提问来源于stack exchange,提问作者Erik
相关产品推荐
相关产品推荐

