C++ 常用数据类型详解(CSP-J 重点版)


一、整型(整数)

类型 字节 数值范围 注意事项 输入输出标识符
short 2 -32768 ~ 32767 适合存储小范围整数 %hd
int 4 -2.1×10⁹ ~ 2.1×10⁹(约9位) 默认整数类型,运算效率最高 %d
long 4/8 -2.1×10⁹ ~ 9.2×10¹⁸(系统相关) 不建议使用(跨平台不一致) %ld
long long 8 -9.2×10¹⁸ ~ 9.2×10¹⁸(19位) 必须用 LL 后缀(如 123456789LL %lld
unsigned int 4 0 ~ 4.2×10⁹ 存储非负数,扩大正数范围 %u

典型应用场景

  • 计数器int(循环变量)
  • 大数计算long long(阶乘、斐波那契数列)
  • 位运算unsigned int(处理二进制位)

二、浮点型(小数)

类型 字节 有效位数 数值范围 精度问题示例
float 4 6~7位 ±3.4×10⁻³⁸ ~ ±3.4×10³⁸ 0.1 + 0.2 ≠ 0.3(二进制存储误差)
double 8 15~16位 ±1.7×10⁻³⁰⁸ ~ ±1.7×10³⁰⁸ 推荐默认使用
long double 16 18~19位 ±1.1×10⁻⁴⁹³² ~ ±1.1×10⁴⁹³² 竞赛中极少使用

三、字符与字符串

类型 存储方式 输入输出 常用操作
char ASCII码(1字节) %c 转义字符(\n换行,\t制表符)
string 动态字符数组(自动扩容) cin >> s / cout << s s.length(), s.substr(pos, len)

重要区别

// C风格字符串(数组形式)
char str[10] = "hello";  // 需要预留'\0'位置
// C++字符串对象
string s = "world";      // 自动管理内存

四、布尔类型

类型 取值 内存占用 逻辑运算
bool true/false 1字节 &&(与), `

注意事项

  • 非零值会自动转为true,零值转false
  • 条件判断中避免写 if(b == true),直接写 if(b)

五、类型转换

转换类型 示例 风险
隐式转换(自动) int a = 3.14;a=3 精度丢失
显式强制转换 double b = (double)5/2;2.5 可能溢出(如 int(5000000000.0)

六、真题实战示例

题目(CSP-J 2022模拟题):
以下代码的输出是什么?

int main() {
    double a = 123456789.0;
    cout << fixed << setprecision(0) << a; 
}

答案123456789double 可精确存储9位整数)


七、编程技巧

  1. 大数处理
    // 计算2^60(必须用long long)
    long long ans = 1LL << 60;
    
  2. 高精度需求
    • 超过 long long 范围时需用字符串或数组模拟计算
  3. 字符运算
    char c = 'A';
    cout << (char)(c + 32); // 输出'a'(ASCII码转换)
    

附:数据类型选择决策树

需要存储的数据类型?
├── 整数 → 
│   ├── 数值 ≤ 1e9 → int
│   └── 数值 > 1e9 → long long
├── 小数 → 
│   ├── 需要高精度 → double
│   └── 内存敏感 → float
├── 单个字符 → char
└── 文本 → string

0 条评论

目前还没有评论...