当前位置: 代码迷 >> C语言 >> abs、 labs的返回值分别为int和long是很不恬当的!。。。
  详细解决方案

abs、 labs的返回值分别为int和long是很不恬当的!。。。

热度:411   发布时间:2008-04-08 01:13:31.0
abs、 labs的返回值分别为int和long是很不恬当的!。。。
abs和labs的原型:int abs(int); long labs(long);

理由1:abs labs函数作用是求解一个数的绝对值,而一个绝对值就一定大于等于0.。
返回值类型为int和long型就有很大意义上的空间利用率浪费。
理由2:以int型为2个字节,long型为4个字节为例,int型的范围(-32768到32767)
long型的范围(-2147483648到2147483647)。从数据类型的范围中,我们可以发
现一个问题。当用abs(-32768)和labs(-2147483648)时,大家可以想想一下结果会是
什么。当然结果分别是-32768和-2147483648。天啊!。。怎么还会出现这样的糟
糕设计。我到现在才发现这个问题。谁来拯救这样糟糕库函数设计吧。

针对以上的问题,笔者建议在使用时,在abs和labs强制类型转换:
(unsigned int)abs和(unsigned long)labs
搜索更多相关的解决方案: labs  int  返回值  long  

----------------解决方案--------------------------------------------------------
挺恰当的,楼主再仔细考虑一下
如果是
unsigned int ,那么完全没有必要调用abs or labs
因此使用abs or labs的几乎都是signed修饰的变量,所以要用abs和labs的这些变量的最大值肯定不会超过这个函数的返回值
----------------解决方案--------------------------------------------------------
发现某些人没事就发原创。

你的输入类型是有符号的,绝对值还能超出超出有符号数范围的?
初中生都知道的绝对值你还敢笑话设计库的人。
----------------解决方案--------------------------------------------------------
---转贴:
ANSI C标准规定了每种整数类型的最小值域(但没有规定它们必须采用哪种编码方案),并要求所有的C语言实现都要在limits.h头文件中通过诸如INT_MIN、INT_MAX这样的宏来指定该实现中整型数据的实际值域,而且这些实际的值域一定不能比标准规定的最小值域还要小(也即要求每种实现在limits.h中定义的宏的绝对值不小于C标准规定的同名宏的绝对值,并且正负号要保持一致)。标准定义的INT_MIN是-(2^15 - 1),INT_MAX是(2^15 - 1),换句话说,标准保证了int型数据至少能表示-(2^15 - 1)到(2^15 - 1)这样一个对称区间内的所有整数,因此程序员可以放心大胆地用int变量存储以上范围内的任何整数。但与此同时请特别注意,用int变量表达超出上述范围的数将是一件没有法律(标准即是程序员的法律)保障的事情,所以不应该想当然地认为-32768(即-2^15)一定可以用int型来表达,尽管它确实位于用二次补码记法(twos-complement notation)进行编码的16位整数的值域内。熟悉以上背景后再回顾abs函数的问题就会发现,实际上该函数对于标准规定范最小值域内的所有整数都能正常工作,而上面提到的引起错误的输入数据已经不在此范围内了,所以此错误不应由abs而应由函数调用者负责。由此可见,为了安全以及可移植性,将表达式欲表示的值严格限制在标准指定的最小值域内是一个良好的编程习惯。
――――――――――――――――――――――――――
原贴:http://blog.csdn.net/soloist/archive/2004/10/26/153123.aspx

[[it] 本帖最后由 now 于 2008-4-13 00:07 编辑 [/it]]
----------------解决方案--------------------------------------------------------
  相关解决方案