C++ 各种类型取值范围

本文介绍了C++中不同数据类型的取值范围,如char、short、int、long等,并强调了在LeetCode环境下参考这些信息的重要性。同时,讨论了编程时可能出现的溢出问题以及如何通过隐式类型转换和强制类型转换来避免溢出。此外,提到了#include<climits>和#include<float.h>头文件中常量用于查看数据范围。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

### C++ 数据类型及其取值范围 #### 整数类型 整数类型用于表示不带小数部分的数值。以下是几种常见整数类型的取值范围: - `char`:通常占用1字节,取值范围为 `-128` 到 `127` 或者 `0` 到 `255`(取决于是否有符号),具体依赖于编译器实现[^1]。 - `short int` 或简称 `short`:一般占2个字节,取值范围大约是 `-32,768` 至 `32,767`[^4]。 - `int`:通常是机器的一个自然单词长度,在现代计算机上多为4字节,因此它的取值范围是从 `-2,147,483,648` 到 `2,147,483,647`。 - `long int` 或简称 `long`:至少可以容纳一个更大的整数值域;在某些平台上可能是4字节而在其他平台则可能达到8字节。对于32位系统而言,其取值范围同 `int` 类型一致;但在64位环境中,它可以扩展到更宽泛的区间,例如从 `-9,223,372,036,854,775,808` 到 `9,223,372,036,854,775,807`。 #### 浮点数类型 浮点数用来表达带有小数部分或者指数形式的实数: - `float`:单精度浮点数,典型情况下占据4字节空间,能够精确表示约六至七位有效数字,并覆盖非常广泛的数量级变化。 - `double`:双精度浮点数,默认占有8字节内存位置,相比 `float` 提供更高的精度——大概十五十六位的有效数字。 #### 布尔类型 (`bool`) 布尔类型仅包含两个逻辑状态之一:“真”(`true`) 和 “假”(`false`) 。尽管标准规定了这两个特殊常量的存在,但实际存储方式可能会有所不同,有的编译环境下它确实是一个独立的数据类型,而另一些环境里这只是一个宏定义或是枚举成员[^2]。 为了防止因不同类型间计算而导致意外溢出的情况发生,开发者应当注意隐式与显式的类型转换规则。当涉及到较大数值的操作时,建议提前将较小的数据类型提升为较大的类型再执行算术运算,从而减少潜在的风险[^3]。 ```cpp // 显示地进行类型转换以避免溢出的例子 #include <iostream> using namespace std; int main() { int a = 100000; int b = 200000; // 正确的做法:先转成更大类型再相乘 long long result = static_cast<long long>(a) * b; cout << "Result of multiplication is: " << result << endl; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

流浪猪头拯救地球

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

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

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

打赏作者

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

抵扣说明:

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

余额充值