[C/C++] 把一个整型整数转成字符串

问题描述:写一个函数,接受一个整数(假定用int表示),输出该整数的字符串形式。采用如下函数原型:

 

void itoa ( int val, char* buf );

 

这里假定buf足够大以容纳任何int类型数值的字符串。

 

这个问题,初看好像没有什么难度。如果是0,就直接输出'0';如果是正数,就通过取模(%)和求商(/)运算可以逐位取得该整数的数字,并把它们放到buf中去;如果是个负数,就先转成正的,然后在最后输出时加入负号。按照这个思路,可以写下如下代码:

 

 

 

一切看起来都没有问题。但是,如果我们这样调用该函数的话,猜猜会输出什么:

 

我们得到的是"-"。这是为什么呢?大家请注意第11行代码。当我们求一负数的绝对值时,如果还是用原来大小的有符号类型时,可能会产生溢出!我们知道,int类型只能表示-231 ~ 231 -1 之间的数值。如果我们对-231 求绝对值并把它存放到int类型的变量中,会发生什么情况?分析到这里,大家都应该清楚了吧!

 

这个bug是很隐蔽的。我在网上看到的代码基本上都和上面给出的差不多,没有考虑这个可能的溢出问题。修正的办法,就是用更大的类型来存放绝对值。观察到绝对值是非负的,我们可以用一个unsigned int 来表示绝对值,这样就不会有问题了。

 

这个题目给我的启示是,虽然看起来简单的题目,也可能有很大的陷阱。如果这是一道面试题的话,估计完全做对的不多,可能也包括现场的我在内。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值