Skip to content

C++ 数字

C++ 提供了多种数字类型,包括整型和浮点型。在本章节中,我们将介绍 C++ 的数字类型及其操作。

1. 数字类型

1.1 整型

整型用于存储整数,包括以下几种类型:

类型说明大小(字节)取值范围
char字符型(本质上是小整型)1-128 到 127
signed char有符号字符型1-128 到 127
unsigned char无符号字符型10 到 255
short短整型2-32768 到 32767
unsigned short无符号短整型20 到 65535
int整型4-2147483648 到 2147483647
unsigned int无符号整型40 到 4294967295
long长整型4 或 8取决于系统
unsigned long无符号长整型4 或 8取决于系统
long long长长整型8-9223372036854775808 到 9223372036854775807
unsigned long long无符号长长整型80 到 18446744073709551615

示例

cpp
#include <iostream>

int main() {
    char c = 'A';
    short s = 1000;
    int i = 100000;
    long l = 1000000L;
    long long ll = 10000000000LL;
    
    unsigned int ui = 4000000000U;
    
    std::cout << "char: " << c << std::endl;
    std::cout << "short: " << s << std::endl;
    std::cout << "int: " << i << std::endl;
    std::cout << "long: " << l << std::endl;
    std::cout << "long long: " << ll << std::endl;
    std::cout << "unsigned int: " << ui << std::endl;
    
    return 0;
}

1.2 浮点型

浮点型用于存储带有小数点的数值,包括以下几种类型:

类型说明大小(字节)精度
float单精度浮点型4约7位小数
double双精度浮点型8约15位小数
long double长双精度浮点型8 或 16取决于系统

示例

cpp
#include <iostream>

int main() {
    float f = 3.14f;
    double d = 3.141592653589793;
    long double ld = 3.14159265358979323846L;
    
    std::cout << "float: " << f << std::endl;
    std::cout << "double: " << d << std::endl;
    std::cout << "long double: " << ld << std::endl;
    
    return 0;
}

2. 数学运算

2.1 基本算术运算

cpp
#include <iostream>

int main() {
    int a = 10;
    int b = 3;
    
    std::cout << "a + b = " << a + b << std::endl;  // 13
    std::cout << "a - b = " << a - b << std::endl;  // 7
    std::cout << "a * b = " << a * b << std::endl;  // 30
    std::cout << "a / b = " << a / b << std::endl;  // 3(整数除法)
    std::cout << "a % b = " << a % b << std::endl;  // 1(取模)
    
    return 0;
}

2.2 浮点数运算

cpp
#include <iostream>

int main() {
    double a = 10.5;
    double b = 3.2;
    
    std::cout << "a + b = " << a + b << std::endl;  // 13.7
    std::cout << "a - b = " << a - b << std::endl;  // 7.3
    std::cout << "a * b = " << a * b << std::endl;  // 33.6
    std::cout << "a / b = " << a / b << std::endl;  // 3.28125
    
    return 0;
}

3. 数学函数

C++ 提供了丰富的数学函数,定义在<cmath>头文件中。

3.1 常用数学函数

函数描述示例
abs(x)绝对值abs(-5) 返回 5
sqrt(x)平方根sqrt(16) 返回 4
pow(x, y)x 的 y 次方pow(2, 3) 返回 8
exp(x)e 的 x 次方exp(1) 返回 2.71828
log(x)自然对数log(2.71828) 返回 1
log10(x)以 10 为底的对数log10(100) 返回 2
sin(x)正弦函数sin(0) 返回 0
cos(x)余弦函数cos(0) 返回 1
tan(x)正切函数tan(0) 返回 0
ceil(x)向上取整ceil(3.14) 返回 4
floor(x)向下取整floor(3.14) 返回 3
round(x)四舍五入round(3.14) 返回 3

示例

cpp
#include <iostream>
#include <cmath>

int main() {
    std::cout << "abs(-5) = " << std::abs(-5) << std::endl;
    std::cout << "sqrt(16) = " << std::sqrt(16) << std::endl;
    std::cout << "pow(2, 3) = " << std::pow(2, 3) << std::endl;
    std::cout << "exp(1) = " << std::exp(1) << std::endl;
    std::cout << "log(2.71828) = " << std::log(2.71828) << std::endl;
    std::cout << "log10(100) = " << std::log10(100) << std::endl;
    std::cout << "sin(0) = " << std::sin(0) << std::endl;
    std::cout << "cos(0) = " << std::cos(0) << std::endl;
    std::cout << "tan(0) = " << std::tan(0) << std::endl;
    std::cout << "ceil(3.14) = " << std::ceil(3.14) << std::endl;
    std::cout << "floor(3.14) = " << std::floor(3.14) << std::endl;
    std::cout << "round(3.14) = " << std::round(3.14) << std::endl;
    
    return 0;
}

4. 随机数

C++ 提供了生成随机数的函数,定义在<cstdlib><random>头文件中。

4.1 旧方法(C 风格)

cpp
#include <iostream>
#include <cstdlib>
#include <ctime>

int main() {
    // 设置随机数种子
    std::srand(std::time(0));
    
    // 生成 1 到 100 之间的随机数
    int random_number = std::rand() % 100 + 1;
    std::cout << "随机数: " << random_number << std::endl;
    
    return 0;
}

4.2 新方法(C++11)

cpp
#include <iostream>
#include <random>

int main() {
    // 创建随机数引擎
    std::random_device rd;
    std::mt19937 gen(rd());
    
    // 创建分布
    std::uniform_int_distribution<> dis(1, 100);
    
    // 生成随机数
    int random_number = dis(gen);
    std::cout << "随机数: " << random_number << std::endl;
    
    return 0;
}

5. 数字格式化输出

5.1 设置精度

cpp
#include <iostream>
#include <iomanip>

int main() {
    double pi = 3.141592653589793;
    
    std::cout << "默认精度: " << pi << std::endl;
    std::cout << "精度为 5: " << std::setprecision(5) << pi << std::endl;
    std::cout << "精度为 10: " << std::setprecision(10) << pi << std::endl;
    std::cout << "固定小数点,精度为 5: " << std::fixed << std::setprecision(5) << pi << std::endl;
    
    return 0;
}

5.2 设置宽度

cpp
#include <iostream>
#include <iomanip>

int main() {
    int a = 10;
    int b = 20;
    int c = 30;
    
    std::cout << "默认宽度:" << std::endl;
    std::cout << a << " " << b << " " << c << std::endl;
    
    std::cout << "宽度为 10:" << std::endl;
    std::cout << std::setw(10) << a << std::setw(10) << b << std::setw(10) << c << std::endl;
    
    return 0;
}

6. 数字类型转换

6.1 隐式转换

cpp
#include <iostream>

int main() {
    int i = 10;
    double d = i;  // int 隐式转换为 double
    
    std::cout << "i = " << i << std::endl;
    std::cout << "d = " << d << std::endl;
    
    return 0;
}

6.2 显式转换

cpp
#include <iostream>

int main() {
    double d = 3.14;
    int i = static_cast<int>(d);  // double 显式转换为 int
    
    std::cout << "d = " << d << std::endl;
    std::cout << "i = " << i << std::endl;
    
    return 0;
}

7. 数字的限制

可以使用<climits><cfloat>头文件中的宏来获取数字类型的限制。

7.1 整型限制

cpp
#include <iostream>
#include <climits>

int main() {
    std::cout << "char 的范围: " << CHAR_MIN << " 到 " << CHAR_MAX << std::endl;
    std::cout << "unsigned char 的范围: 0 到 " << UCHAR_MAX << std::endl;
    std::cout << "short 的范围: " << SHRT_MIN << " 到 " << SHRT_MAX << std::endl;
    std::cout << "unsigned short 的范围: 0 到 " << USHRT_MAX << std::endl;
    std::cout << "int 的范围: " << INT_MIN << " 到 " << INT_MAX << std::endl;
    std::cout << "unsigned int 的范围: 0 到 " << UINT_MAX << std::endl;
    std::cout << "long 的范围: " << LONG_MIN << " 到 " << LONG_MAX << std::endl;
    std::cout << "unsigned long 的范围: 0 到 " << ULONG_MAX << std::endl;
    std::cout << "long long 的范围: " << LLONG_MIN << " 到 " << LLONG_MAX << std::endl;
    std::cout << "unsigned long long 的范围: 0 到 " << ULLONG_MAX << std::endl;
    
    return 0;
}

7.2 浮点型限制

cpp
#include <iostream>
#include <cfloat>

int main() {
    std::cout << "float 的最小值: " << FLT_MIN << std::endl;
    std::cout << "float 的最大值: " << FLT_MAX << std::endl;
    std::cout << "double 的最小值: " << DBL_MIN << std::endl;
    std::cout << "double 的最大值: " << DBL_MAX << std::endl;
    std::cout << "long double 的最小值: " << LDBL_MIN << std::endl;
    std::cout << "long double 的最大值: " << LDBL_MAX << std::endl;
    
    return 0;
}

8. 示例:综合运用

现在,让我们看一个综合运用各种数字操作的例子:

cpp
#include <iostream>
#include <cmath>
#include <random>
#include <iomanip>
#include <climits>

int main() {
    // 整型
    std::cout << "整型:" << std::endl;
    int i = 100000;
    long long ll = 10000000000LL;
    std::cout << "int: " << i << std::endl;
    std::cout << "long long: " << ll << std::endl;
    std::cout << std::endl;
    
    // 浮点型
    std::cout << "浮点型:" << std::endl;
    float f = 3.14f;
    double d = 3.141592653589793;
    std::cout << "float: " << f << std::endl;
    std::cout << "double: " << d << std::endl;
    std::cout << std::endl;
    
    // 数学运算
    std::cout << "数学运算:" << std::endl;
    int a = 10;
    int b = 3;
    std::cout << "a + b = " << a + b << std::endl;
    std::cout << "a - b = " << a - b << std::endl;
    std::cout << "a * b = " << a * b << std::endl;
    std::cout << "a / b = " << a / b << std::endl;
    std::cout << "a % b = " << a % b << std::endl;
    std::cout << std::endl;
    
    // 数学函数
    std::cout << "数学函数:" << std::endl;
    std::cout << "sqrt(16) = " << std::sqrt(16) << std::endl;
    std::cout << "pow(2, 3) = " << std::pow(2, 3) << std::endl;
    std::cout << "abs(-5) = " << std::abs(-5) << std::endl;
    std::cout << std::endl;
    
    // 随机数
    std::cout << "随机数:" << std::endl;
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_int_distribution<> dis(1, 100);
    int random_number = dis(gen);
    std::cout << "随机数: " << random_number << std::endl;
    std::cout << std::endl;
    
    // 数字格式化输出
    std::cout << "数字格式化输出:" << std::endl;
    double pi = 3.141592653589793;
    std::cout << "默认精度: " << pi << std::endl;
    std::cout << "固定小数点,精度为 5: " << std::fixed << std::setprecision(5) << pi << std::endl;
    std::cout << std::endl;
    
    // 数字类型转换
    std::cout << "数字类型转换:" << std::endl;
    double d2 = 3.14;
    int i2 = static_cast<int>(d2);
    std::cout << "double: " << d2 << std::endl;
    std::cout << "int: " << i2 << std::endl;
    std::cout << std::endl;
    
    // 数字的限制
    std::cout << "数字的限制:" << std::endl;
    std::cout << "int 的范围: " << INT_MIN << " 到 " << INT_MAX << std::endl;
    std::cout << "double 的最小值: " << DBL_MIN << std::endl;
    std::cout << "double 的最大值: " << DBL_MAX << std::endl;
    
    return 0;
}

小结

C++ 数字包括:

  1. 数字类型

    • 整型:charshortintlonglong long
    • 浮点型:floatdoublelong double
  2. 数学运算

    • 基本算术运算:+-*/%
    • 浮点数运算
  3. 数学函数

    • abs(x):绝对值
    • sqrt(x):平方根
    • pow(x, y):x 的 y 次方
    • sin(x)cos(x)tan(x):三角函数
    • ceil(x)floor(x)round(x):取整函数
  4. 随机数

    • 旧方法(C 风格):使用std::rand()std::srand()
    • 新方法(C++11):使用<random>
  5. 数字格式化输出

    • 设置精度:std::setprecision()
    • 设置宽度:std::setw()
  6. 数字类型转换

    • 隐式转换
    • 显式转换:static_cast<>()
  7. 数字的限制

    • 使用<climits><cfloat>头文件中的宏

掌握数字类型和操作是编写 C++ 程序的基础,在后续章节中,我们将学习 C++ 的数组。