数值转换和溢出相关问题

问题: abs(INT_MIN) 为负数?

思路:

首先要明确int的取值范围

在C++中包含在

#include<climit>中,由宏变量INT_MAX和INT_MIN表示;

其次明确int,long int,以及long long int的字节长度,

可以用sizeof(type)查出;

由于long int是为了兼容32位,所以在32位机上是32bit,在64位机上市64位;

明白这几个点之后,重点理解abs函数

我们考虑一个极端的例子,

Num = INT_MIN;

则abs(Num) 等于多少呢?

首先需要理解abs的函数参数和返回值;

在C库中,包含#include<stdio.h>和#include<stdlib.h>,可以知道 int abs(int n)。

可知道返回值为int,则 abs(Num) = Num仍是负数;

对于溢出的整数,仍然无法解决,需要用

Long int labs(long int n)   for long int

Long long int llabs(long long int n)  for long long int

在C++中,利用函数重载,进行了统一接口,统一调用abs即可;需要包含头文件#include<cmath>

int abs (int n);

long int abs (long int n);

long long int abs (long long int n);

这样可以根据参数类型来调用具体的函数,而不需要自己来选择具体调用哪个函数;

设计到整数溢出的例子,首先将整数转为长整数,然后所有的结果都用长整数表示,这样可以保证不溢出;其次要保证头文件包含cmath,保证调用的是c++头文件中的abs

数字转字符串

C中函数,sprintf(char *str,const char * format, …)

存在的问题,无法控制str的大小,属于un-safe函数,可能内存溢出;另外需要需要正确,d为int,ld为long int,lld为long long int,否则会出现数值溢出的情况;

如sprintf(str,"%d",INT_MAX+1)

Snprintf(char *str,int n ,const char * format,..) 相对安全

C++ 提供的格式转换#include <sstream>,借助中间字符流stringstream来实现格式转换;

Template <class Input_Type, class Output_Type>

Output_Type convert(Input_Type number) {

         Stringstream ss;

         Ss<<number;

         Output_Type result;

         ss>>result;

         return result;

}

String ss = Convert<int,string>(5.5);

posted @ 2014-12-29 14:52  purejade  阅读(676)  评论(0编辑  收藏  举报