C++ 各种类型取值范围

20 篇文章 0 订阅

Part.I Introduction

首先要说明的一点,不同编译器中相同类型的字节数可能不一样,导致它们们的取值范围不一样。本文主要针对LeetCode,所以内容仅供参考。

Part.II 各类型取值范围

变量名字节数数据范围
char1-128 ~ 127
short2-32767 ~ 32768
unsigned short20 ~ 65535
int4 − 2.1 × 1 0 9 ∼ 2.1 × 1 0 9 -2.1\times 10^{9} \sim 2.1\times 10^{9} 2.1×1092.1×109
unsigned int4 0 ∼ 4.3 × 1 0 9 0 \sim 4.3\times 10^{9} 04.3×109
long8 − 9 × 1 0 18 ∼ 9 × 1 0 18 -9\times 10^{18} \sim 9\times 10^{18} 9×10189×1018
unsigned long8 0 ∼ 1.8 × 1 0 19 0 \sim 1.8\times 10^{19} 01.8×1019
long long8 − 9 × 1 0 18 ∼ 9 × 1 0 18 -9\times 10^{18} \sim 9\times 10^{18} 9×10189×1018
float4 ± 3.4 × 1 0 − 38 ∼ ± 3.4 × 1 0 38 ±3.4\times 10^{-38}\sim±3.4\times 10^{38} ±3.4×1038±3.4×1038,1 位符号位,8 位指数位,23 位尾数位;小数点后有效数字 7 位(精度)
double8 ± 1.7 × 1 0 − 308 ∼ ± 1.7 × 1 0 308 ±1.7\times 10^{-308}\sim±1.7\times 10^{308} ±1.7×10308±1.7×10308,1 位符号位,11 位指数位,52 位小数位;小数点后有效数字 15 位(精度)

#include <climits>#include <float.h> 头文件其实已经用常量记录了不同变量的数据范围。下面是该头文件中的所有符号常量,我们可以通过这些常量查看不同变量的数据范围。

------------------ #include <climits> -------------------------
CHAR_MIN       	char 最小值
SCHAR_MAX      	signed char 最大值
SCHAR_MIN       	signed char 最小值
UCHAR_MAX      	unsigned char 最大值
SHRT_MAX       	short 最大值
SHRT_MIN       	short 最小值
USHRT_MAX      	unsigned short 最大值
INT_MAX       	int 最大值
INT_MIN       	int 最小值
UINT_MAX       	unsigned int 最大值
UINT_MIN        unsigned int 最小值
LONG_MAX      	long 最大值
LONG_MIN       	long 最小值
ULONG_MAX      	unsigned long 最大值
LLONG_MAX      	long long 最大值
LLONG_MIN       long long 最小值
------------------ #include <float.h> -------------------------
FLT_MANT_DIG    	float 类型的尾数
FLT_DIG       	float 类型的最少有效数字位数
FLT_MIN_10_EXP   	带有全部有效数的float类型的负指数的最小值(以10为底)
FLT_MAX_10_EXP    	float 类型的正指数的最大值(以10为底)
FLT_MIN       	保留全部精度的 float 类型正数最小值
FLT_MAX       	float 类型正数最大值
// 还有关于 double 的,就不详细列举了

Part.III 一些技巧

在用 C++ 刷题的时候,很容易因为两个大数相加或相乘导致数据溢出,所以这时候就需要注意了:

  • 隐式类型转换:一个大类型与一个小类型做运算,最后得到一个大类型的数据(除非把它赋值给一个小类型)。比如,一个long与一个int做运算,最后得到一个long,但是如果将结果赋值给一个int,那么赋值的时候会『截位』。
  • 强制类型转换:当两个小类型进行运算的时候,如果运算结果超出了该类型能表示的范围,需用强制类型转换将其转换为大类型。比如,当两个int做乘法运算时,可以用long long ans = (long long)a * b;。后面的a * b不要括号,也就是说先将一个转换为大类型,然后根据隐式类型转换,得到的结果也是大类型,所以就不会溢出了。要括号的话还是会有问题。

Reference

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

流浪猪头拯救地球

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值