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