C++数值类型极限值的获取

C/C++中基本类型的数值极限值一般来说都是与具体平台有关的,在程序设计的过程中为了写出与平台无关的程序则必须通过合理科学的方法去获取各种类型的极值,常用的获取方法有两种:一种是传统的C语言所采用的预处理器常数,另一种方法则是通过标准库中所提供的模版类numeric_limits<>来获取这些极值。

下面先详解其用法后再评其优劣:

一、传统C语言的预处理器常数

在C++中这些C语言的预处理器常数任然可以用,一般对于各种基本固有类型的最大值宏为:

INT_MAX、FLT_MAX、DBL_MAX、SHRT_MAX、CHAR_MAX. . . . .

分别对应int、float、double、short、char、、、的最大值,其他类型都有类似形式的宏

最小值宏为:

INT_MIN、FLT_MIN、DBL_MIN、SHRT_MIN、CHAR_MIN. . . . .

分别对应int、float、double、short、char、、、的最小值,其他类型都有类似形式的宏

二、标准库template numeric_limits<>

numeric_limits<>是一个模版类,它是有一个通用模版和一系列各种类型的特化模版组成,在该模版类中常用的几个数据成员和成员函数如下:

is_specialized
该类型是否存在极值

is_signed
该类型是否带有正负号

min()
获取最小值

max()
获取最大值

具体应用示例代码如下:

#include<iostream>
#include<string>
using namespace std;
int main()
{
//传统C语言的数值极限
	cout<<"int:MAX()  "<<INT_MAX<<endl;
	cout<<"int:MIN()  "<<INT_MIN<<endl;
	cout<<"float:MAX()  "<<FLT_MAX<<endl;
	cout<<"float:MIN()  "<<FLT_MIN<<endl;
	cout<<"double:MAX()  "<<DBL_MAX<<endl;
	cout<<"double:MIN()  "<<DBL_MIN<<endl;
	cout<<"short:MAX()  "<<SHRT_MAX<<endl;
	cout<<"short:MIN()  "<<SHRT_MIN<<endl;

//采用模版类numeric_limits<>的方式获取极值
	cout<<"int:MAX()  "<<numeric_limits<int>::max()<<endl;
	cout<<"int:MIN()  "<<numeric_limits<int>::min()<<endl;
	cout<<"float:MAX()  "<<numeric_limits<float>::max()<<endl;
	cout<<"float:MIN()  "<<numeric_limits<float>::min()<<endl;
	cout<<"double:MAX()  "<<numeric_limits<double>::max()<<endl;
	cout<<"double:MIN()  "<<numeric_limits<double>::min()<<endl;
	cout<<"short:MAX()  "<<numeric_limits<short>::max()<<endl;
	cout<<"short:MIN()  "<<numeric_limits<short>::min()<<endl;

//判断是否存在极值
	cout<<"string类型是否存在极值:"<<numeric_limits<string>::is_specialized<<endl;
}

//输出结果如下:
int:MAX()  2147483647
int:MIN()  -2147483648
float:MAX()  3.40282e+038
float:MIN()  1.17549e-038
double:MAX()  1.79769e+308
double:MIN()  2.22507e-308
short:MAX()  32767
short:MIN()  -32768
int:MAX()  2147483647
int:MIN()  -2147483648
float:MAX()  3.40282e+038
float:MIN()  1.17549e-038
double:MAX()  1.79769e+308
double:MIN()  2.22507e-308
short:MAX()  32767
short:MIN()  -32768
string类型是否存在极值:0
请按任意键继续. . .

简评:做为拥有优秀代码风格的程序员来说最好的选择方式应该还是用标准库的template numeric_limits<>会比较好,具体的理由是:一、相比C语言的预定义常数标准库的numeric_limits提供了更好的安全性;二、numeric_limits<>类可以说是一个各种类型信息的模版体系,更加规范,而且更重要的是程序员自己也可以通过为template
numeric_limits增加特化版本而你自定义的数值类型增加类型信息,从而在编程时可以达到统一规范调用的效果。

C++数值类型极限值的获取

时间: 2024-08-27 20:35:46

C++数值类型极限值的获取的相关文章

.Net判断一个对象是否为数值类型探讨总结(高营养含量,含最终代码及跑分)

前一篇发出来后引发了积极的探讨,起到了抛砖引玉效果,感谢大家参与. 吐槽一下:这个问题比其看起来要难得多得多啊. 大家的讨论最终还是没有一个完全正确的答案,不过我根据讨论结果总结了一个差不多算是最终版的代码,这里分享出来,毕竟这是大家共同的智慧结晶,没有交流和碰撞就没有这段代码. 探讨贡献提名典礼 首先感谢 花生!~~ 以及 NETRUBE 提出了使用 GetTypeCode() 获取类型代码的方式,这个比 typeof() 的性能要高,但是有一点局限性,后面代码中会指出. 由 JTANS 以及

.Net判断一个对象是否为数值类型

这乍一听是个很简单的事,但突然搞起来还真有点无从下手的感觉. 首先当然是通过GetType()方法反射获取其类型信息,然后对其进行分析,但是类型信息Type中并没有简单地给出这么一个属性进行判断. 老外给出的方法是: public static bool IsNumeric(this Type dataType) { if (dataType == null) throw new ArgumentNullException("dataType"); return (dataType =

C++.【转】C++数值类型与string的相互转换

1.C++数值类型与string的相互转换 - JohnGu - 博客园.html(https://www.cnblogs.com/johngu/p/7878029.html) 2. 1.数值类型转换为string 1.1使用函数模板+ostringstream 使用函数模板将基本数据类型(整型.字符型.实型.布尔型)转换成string. 1 2 3 4 5 6 7 8 9 10 11 12 //ostringstream对象用来进行格式化的输出,常用于将各种类型转换为string类型 //os

oracle中的常用函数、字符串函数、数值类型函数、日期函数,聚合函数。

一.字符串的常用函数. --一.oracle 字符串常用函数 --1. concat 连接字符串的函数,只能连接[两个]字符串. 字符写在括号中,并用逗号隔开! --2.“||”符号可以连接多个字符串 直接用||将多个字符链接即可. --3. dual? dual是一个虚拟表,用来构成select的语法规则,oracle保证dual里面永远只有一条记录. select concat('lo','ve')from dual; select concat('o','k')from dual; sel

c#数值类型以及继承情况

一.数值类型继承 数值类型都是继承于valueType  存放在栈中  读写速度快,引用类型放在堆中慢. 二.定义可为空的数值类型 int x1=null;//编译器报错 int? x1=null;//正确 三.自定义枚举值范围 一般情况下枚举的数值类型为int  但是需要的时候也可自定义范围,比如 enum MyselfEnum:byte { x1=0x1, x2=327,//这里会报错,超出了范围 }

关于数据库中varchar/nvarchar类型数据的获取注意事项

当在页面后台获取数据库表中某字段的数据时,需注意该数据的类型.防止因实际数据的字符长度因达不到指定数据类型规定的字符长度而导致空格的占位符. 比如: MSSQL中某一表的结构如下:   表中的数据: 当从表中获取某一个用户名(userName)或密码(userPwd)时,如果取出的数据作为条件进行判断是,需注意获取处的数据最好进行Trim()处理,去除数据两边的空格占位符 比如: 没有对数据进行Trim()处理前,从数据库中获取的数据因为原本的数据长度不够而导致空格占位符 对数据进行Trim()

数值类型与字节数组之间的相互转换

我们在上文 如何选择使用字符串还是数字呢? 中阐述了使用数值类型的好处,那么问题来了,如何在数值类型与字节数组之间相互转换呢? 我们先看看单个数值类型和字节数组之间的转换,我们以Integer类型为例: public static byte[] intToBytes(int x) {     ByteBuffer intBuffer = ByteBuffer.allocate(Integer.BYTES);     intBuffer.putInt(0, x);     return intBu

C#1(.net和C#的关系、VS与.net的对应关系、VS2012常用的几种应用程序、C#定义一个类的方法、类页面内容的解释、定义Person的类、调用Person类的方法、命名规范、数值类型)

1..net和C#的关系 .net是一个开发平台,C#是应用在.net平台上的一种语言.   2.VS与.net的对应关系  3.VS2012常用的几种应用程序 第一种是Windows窗体应用程序,也即是我们常用的C/S端的应用软件: 第二种是控制台应用程序,主要是用来学习调试C#代码的(老师上课应用的模式): 第三种是空Web应用程序,建立空的网页模式,B/S模式: 第四种是Web 窗体应用程序,建立后会生成一些常用的网页组件和功能,例如JS.image等,也是B/S模式. 4.C#定义一个类

C#2 (数值类型及调用、引用类型及调用、装拆箱、常量、变量、数据类型转换、算术运算符、赋值运算符、关系运算符、逻辑运算符、字符串的常用方法)

一.数值类型及其调用原理 名称 说明 所占字节 范围 byte 字节型 1 -27~27-1 short 短整型 2 -215~215-1 int 整型 4 -231~231-1 long 长整型 8 -263~263-1 char 字符型 1 0~65535 float 单精度型 4 ±1.5*10-45~±3.4*1038 double 双精度型 8 ±5.0*10-324~±1.7*10308 bool 布尔型 1 只有true和false两个值 static void Main(stri