返回信息流unsigned long abslong(long n)
{
return n < 0 ? -n : n;
}
有没必要写成这样:
#include <limits.h>
unsinged long abslong(long n)
{
if ( n == LONG_MIN )
{
return LONG_MAX + 1UL;
}
return n < 0 ? -n : n;
}
看到有的书上是这么说的,负数比正数多一个,自己试了下,输入 LONG_MIN 时两个函数效果是一样的,不知道跟编译器有关系不,我用 llvm 试的.
这是一条镜像帖。来源:北邮人论坛 / cpp / #84492同步于 2014/11/29
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖
[讨论] 负数比正数多一个
SinceBelieve
2014/11/29镜像同步4 回复
订阅后,新回复会通过你的通知中心匿名送达。
4 条回复
【 在 liuaner022 的大作中提到: 】
: 会不会是因为你返回值正好是unsign long的关系?
也就是说如果把取相反数的结果当做无符号的就不用考虑负数多一个的情况了?
C语言里有符号整数溢出是undefined behaviour。比如计算-0x80000000的值(如果是32位有符号整数)。这种情况,从什么都不发生到计算机冒烟都有可能发生。
所以,应该先转换成无符号数,然后用加减法或者位运算来求。有符号到无符号的转换是有确定行为的。无符号数溢出是有确定行为的:结果只保留最低的32位(如果是32位的话)
这个帖子说得比较清楚:http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe
另外,stdlib.h里有abs函数的。
看来额外的操作还是有必要的,labs 返回 long 型,manpage 说输入 LONG_MIN 会返回 LONG_MIN
【 在 nuanyangyang 的大作中提到: 】
: C语言里有符号整数溢出是undefined behaviour。比如计算-0x80000000的值(如果是32位有符号整数)。这种情况,从什么都不发生到计算机冒烟都有可能发生。
: 所以,应该先转换成无符号数,然后用加减法或者位运算来求。有符号到无符号的转换是有确定行为的。无符号数溢出是有确定行为的:结果只保留最低的32位(如果是32位的话)
: 这个帖子说得比较清楚:http://stackoverflow.com/questions/50605/signed-to-unsigned-conversion-in-c-is-it-always-safe
: ...................