没有合适的资源?快使用搜索试试~ 我知道了~
C++值函数让我想到了什么
需积分: 0 0 下载量 30 浏览量
2020-12-22
15:53:59
上传
评论
收藏 48KB PDF 举报
温馨提示
试读
1页
这些天恰好要用到一个值的函数。好吧,你会说这个直接用std::abs不行了吗?对的,一开始我也是这样用的。但是如果去求小的那个int的值的值,会导致输出不正确。如: int min_int = -2147483648; cout<<std::abs(min_int)<<endl; </std::abs(min_int)<<endl; <std::abs(min_int)<<endl; 得到的结果仍然是-2147483648!恰好我的程序有可能出现这样的情况。所以需要自己去完成一个。 1、第一个版本: unsigned int __
资源详情
资源评论
资源推荐
C++值函数让我想到了什么值函数让我想到了什么
这些天恰好要用到一个值的函数。好吧,你会说这个直接用std::abs不行了吗?对的,一开始我也是这样用的。但是如果
去求小的那个int的值的值,会导致输出不正确。如:
int min_int = -2147483648;
cout<<std::abs(min_int)<<endl; </std::abs(min_int)<<endl;
<std::abs(min_int)<<endl; 得到的结果仍然是-2147483648!恰好我的程序有可能出现这样的情况。所以需要自己去完成
一个。
1、第一个版本:
unsigned int __abs(int value)
{
return (value >= 0) ? value : -value;
}
仍然是std::abs的老路,不可取!
2、第二个版本:
#include
unsigned int __abs(int value)
{
return (std::numeric_limits::min() == value || value >= 0) ? value : -value;
}
这个版本比较简洁,可移植性也很高。std::numeric_limits::min()返回当前系统下int值的小值,能够自适应int的内存宽度
返回准确的值。当value和小的int值相等或者value不为负数时,我们直接进行位对位的拷贝——因为unsigned int没有符号
位,所以完全可行的。当value为除小值外的负数时,直接取相反数即可。
但这个版本需要用到两次条件判断,能不能再优化一下呢?所以出现了:
3、第三个版本:
unsigned int __abs(int value)
{
unsigned int copyed_value = value;
return (copyed_value > 0x80000000) ? -value : copyed_value;
}
因为32位下小的int值为0x80000000——高位符号位为1。当位对位拷贝到unsigned int中时,仍然是这个值。但其他的负
数除了高位为1外,其余位置也有值,比如-1的16进制表示为:0x80000001。所以,我们先执行位对位的拷贝,到
copyed_value中。所以出现了判断情况:
(1)如果copyed_value是大于0x80000000的,说明value是负数,所以我们直接取相反数(-value);
(2)如果copyed_value是等于0x80000000的,说明value恰好是小的那个负数,执行位对位拷贝后,copyed_value中存
放的是value的值,所以返回copyed_value;
(3)如果copyed_value是小于0x80000000,说明value为正数。直接去alue或者copyed_value即可。
通过分析,我们将(2)和(3)合并到一起,返回copyed_value。所以,采取第三种方案,只有一次比较操作。比第二
种方案省一次。但是这种方案第一眼看去可能易读性上不是很好。
权衡三种方案,应该说各有利弊。三种情况各有适用的地方。如果你的函数不考虑小int值的值,可以采用std::abs即可;
如果需要考虑但不必担心性能问题,那么第二种方案是你好的选择!但如果你既要考虑小int值的值问题,又要考虑性能问
题,建议采用第三个方案。
这个问题虽然简单,但里面透射出来的东西可真不少。其实我们在编程工作中,从细节出抓起,往往能够获得很多收获。
</std::abs(min_int)<<endl;
weixin_38705762
- 粉丝: 6
- 资源: 905
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0