C++基本数据类型 #
一、数据类型概述 #
C++是一种强类型语言,每个变量都有确定的类型。基本数据类型包括:
- 整型:整数类型
- 浮点型:小数类型
- 字符型:字符类型
- 布尔型:逻辑类型
- 空类型:void
二、整型 #
2.1 整型分类 #
| 类型 | 存储大小 | 取值范围 |
|---|---|---|
short |
2字节 | -32768 ~ 32767 |
int |
4字节 | -2147483648 ~ 2147483647 |
long |
4/8字节 | 至少与int相同 |
long long |
8字节 | -9223372036854775808 ~ 9223372036854775807 |
2.2 有符号与无符号 #
cpp
// 有符号整型(可正可负)
short s = -100;
int i = -100000;
long l = -1000000L;
long long ll = -1000000000000LL;
// 无符号整型(只能为正)
unsigned short us = 100;
unsigned int ui = 100000U;
unsigned long ul = 1000000UL;
unsigned long long ull = 1000000000000ULL;
2.3 类型大小 #
cpp
#include <iostream>
int main() {
std::cout << "short: " << sizeof(short) << " bytes" << std::endl;
std::cout << "int: " << sizeof(int) << " bytes" << std::endl;
std::cout << "long: " << sizeof(long) << " bytes" << std::endl;
std::cout << "long long: " << sizeof(long long) << " bytes" << std::endl;
return 0;
}
2.4 固定宽度整型(C++11) #
cpp
#include <cstdint>
// 固定宽度整型
int8_t i8 = 127; // 8位有符号整数
int16_t i16 = 32767; // 16位有符号整数
int32_t i32 = 2147483647; // 32位有符号整数
int64_t i64 = 9223372036854775807LL; // 64位有符号整数
uint8_t u8 = 255; // 8位无符号整数
uint16_t u16 = 65535; // 16位无符号整数
uint32_t u32 = 4294967295U; // 32位无符号整数
uint64_t u64 = 18446744073709551615ULL; // 64位无符号整数
2.5 整数字面量 #
cpp
// 十进制
int dec = 123;
// 八进制(以0开头)
int oct = 0173; // 123
// 十六进制(以0x或0X开头)
int hex = 0x7B; // 123
// 二进制(C++14,以0b或0B开头)
int bin = 0b1111011; // 123
// 数字分隔符(C++14)
int large = 1'000'000; // 1000000
2.6 整数溢出 #
cpp
// 有符号整数溢出是未定义行为
int x = INT_MAX;
x = x + 1; // 未定义行为
// 无符号整数溢出是定义行为(回绕)
unsigned int y = UINT_MAX;
y = y + 1; // 结果为0
#include <climits>
#include <limits>
// 获取类型范围
std::cout << "int max: " << INT_MAX << std::endl;
std::cout << "int min: " << INT_MIN << std::endl;
// 使用numeric_limits
std::cout << "int max: " << std::numeric_limits<int>::max() << std::endl;
std::cout << "int min: " << std::numeric_limits<int>::min() << std::endl;
三、浮点型 #
3.1 浮点型分类 #
| 类型 | 存储大小 | 精度 | 取值范围 |
|---|---|---|---|
float |
4字节 | 约6-7位有效数字 | ±3.4E38 |
double |
8字节 | 约15-16位有效数字 | ±1.7E308 |
long double |
8/16字节 | 扩展精度 | 平台相关 |
3.2 浮点数定义 #
cpp
float f = 3.14f; // float字面量后缀f或F
double d = 3.14; // double是默认类型
long double ld = 3.14L; // long double后缀l或L
// 科学计数法
float f2 = 3.14e2f; // 314.0
double d2 = 3.14E-2; // 0.0314
3.3 浮点数精度 #
cpp
#include <iostream>
#include <iomanip>
int main() {
float f = 3.14159265358979323846f;
double d = 3.14159265358979323846;
std::cout << std::setprecision(20);
std::cout << "float: " << f << std::endl;
std::cout << "double: " << d << std::endl;
return 0;
}
// 输出:
// float: 3.14159274101257324219
// double: 3.141592653589793116
3.4 浮点数比较 #
cpp
#include <cmath>
// 不要直接比较浮点数
double a = 0.1 + 0.2;
double b = 0.3;
// a == b 可能为false
// 正确的比较方式
bool isEqual(double x, double y, double epsilon = 1e-9) {
return std::abs(x - y) < epsilon;
}
// 或使用相对误差
bool isEqualRelative(double x, double y, double epsilon = 1e-9) {
return std::abs(x - y) < epsilon * std::max(std::abs(x), std::abs(y));
}
3.5 特殊浮点值 #
cpp
#include <cmath>
#include <limits>
int main() {
// 无穷大
double inf = std::numeric_limits<double>::infinity();
double inf2 = 1.0 / 0.0; // 无穷大
std::cout << "infinity: " << inf << std::endl;
std::cout << "isinf: " << std::isinf(inf) << std::endl;
// 非数(NaN)
double nan = std::numeric_limits<double>::quiet_NaN();
double nan2 = 0.0 / 0.0; // NaN
std::cout << "NaN: " << nan << std::endl;
std::cout << "isnan: " << std::isnan(nan) << std::endl;
// NaN比较特性
std::cout << "nan == nan: " << (nan == nan) << std::endl; // false!
return 0;
}
四、字符型 #
4.1 基本字符型 #
cpp
char c = 'A';
char c2 = 65; // ASCII码,也是'A'
char c3 = '\x41'; // 十六进制转义,也是'A'
// char的大小固定为1字节
std::cout << "char size: " << sizeof(char) << std::endl; // 1
4.2 字符字面量 #
cpp
// 普通字符
char c1 = 'A';
char c2 = '0';
char c3 = ' ';
// 转义字符
char newline = '\n'; // 换行
char tab = '\t'; // 制表符
char backslash = '\\'; // 反斜杠
char singleQuote = '\''; // 单引号
char doubleQuote = '\"'; // 双引号
char nullChar = '\0'; // 空字符
// 数值转义
char hex = '\x41'; // 十六进制(A)
char oct = '\101'; // 八进制(A)
4.3 宽字符与Unicode #
cpp
// 宽字符
wchar_t wc = L'中';
// C++11 Unicode字符类型
char16_t c16 = u'中'; // UTF-16
char32_t c32 = U'中'; // UTF-32
// C++20 char8_t
char8_t c8 = u8'A'; // UTF-8字符
4.4 字符处理函数 #
cpp
#include <cctype>
char c = 'A';
// 分类函数
std::isalpha(c); // 是否字母
std::isdigit(c); // 是否数字
std::isalnum(c); // 是否字母或数字
std::isspace(c); // 是否空白字符
std::isupper(c); // 是否大写
std::islower(c); // 是否小写
std::ispunct(c); // 是否标点符号
// 转换函数
std::toupper(c); // 转大写
std::tolower(c); // 转小写
五、布尔型 #
5.1 布尔类型 #
cpp
bool b1 = true;
bool b2 = false;
bool b3 = 1; // true
bool b4 = 0; // false
bool b5 = 10; // true(非零为true)
std::cout << std::boolalpha;
std::cout << b1 << std::endl; // true
std::cout << b2 << std::endl; // false
5.2 布尔运算 #
cpp
bool a = true;
bool b = false;
// 逻辑运算
bool c = a && b; // 逻辑与:false
bool d = a || b; // 逻辑或:true
bool e = !a; // 逻辑非:false
// 比较运算
bool f = (5 > 3); // true
bool g = (5 == 3); // false
5.3 布尔类型大小 #
cpp
std::cout << "bool size: " << sizeof(bool) << std::endl; // 通常为1字节
六、void类型 #
6.1 void的用途 #
cpp
// 1. 无返回值函数
void printHello() {
std::cout << "Hello" << std::endl;
}
// 2. 无参数函数
int getValue(void) {
return 10;
}
// 3. 通用指针
void* ptr; // 可以指向任何类型
6.2 void指针 #
cpp
void* ptr;
int x = 10;
ptr = &x; // void指针可以指向任何类型
// 使用前需要类型转换
int* intPtr = static_cast<int*>(ptr);
std::cout << *intPtr << std::endl;
七、类型别名 #
7.1 typedef #
cpp
typedef int Integer;
typedef double Real;
typedef char* String;
Integer a = 10;
Real b = 3.14;
String s = "hello";
7.2 using(C++11推荐) #
cpp
using Integer = int;
using Real = double;
using String = char*;
// 更清晰的语法
using IntVec = std::vector<int>;
using StringMap = std::map<std::string, std::string>;
7.3 typedef vs using #
cpp
// typedef不支持模板别名
// typedef std::vector<int> IntVec; // 可以
// typedef std::vector<T> Vec<T>; // 错误
// using支持模板别名
template<typename T>
using Vec = std::vector<T>;
Vec<int> v1;
Vec<double> v2;
八、类型属性 #
8.1 查看类型信息 #
cpp
#include <iostream>
#include <typeinfo>
int main() {
int x = 10;
double y = 3.14;
std::cout << "x type: " << typeid(x).name() << std::endl;
std::cout << "y type: " << typeid(y).name() << std::endl;
return 0;
}
8.2 类型大小 #
cpp
#include <iostream>
int main() {
std::cout << "char: " << sizeof(char) << " bytes" << std::endl;
std::cout << "short: " << sizeof(short) << " bytes" << std::endl;
std::cout << "int: " << sizeof(int) << " bytes" << std::endl;
std::cout << "long: " << sizeof(long) << " bytes" << std::endl;
std::cout << "long long: " << sizeof(long long) << " bytes" << std::endl;
std::cout << "float: " << sizeof(float) << " bytes" << std::endl;
std::cout << "double: " << sizeof(double) << " bytes" << std::endl;
std::cout << "bool: " << sizeof(bool) << " bytes" << std::endl;
return 0;
}
九、总结 #
数据类型一览 #
| 类型 | 大小 | 用途 |
|---|---|---|
char |
1字节 | 字符 |
short |
2字节 | 小整数 |
int |
4字节 | 整数 |
long |
4/8字节 | 大整数 |
long long |
8字节 | 很大整数 |
float |
4字节 | 单精度浮点 |
double |
8字节 | 双精度浮点 |
bool |
1字节 | 布尔值 |
类型选择建议 #
cpp
// 整数:优先使用int,大数用long long
int count = 0;
long long population = 7800000000LL;
// 浮点数:优先使用double
double price = 99.99;
// 字符:使用char
char grade = 'A';
// 布尔:使用bool
bool isValid = true;
// 固定宽度:使用int32_t、int64_t等
int32_t fixedWidth = 100;
下一步,让我们学习类型转换!
最后更新:2026-03-26