数值转换和溢出相关问题
问题: 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);