Skip to content

C++ 修饰符类型

C++ 提供了多种类型修饰符,用于修改基本数据类型的行为。这些修饰符可以改变数据类型的存储大小、取值范围或符号属性。

1. 类型修饰符概述

C++ 的类型修饰符包括:

  1. signed:有符号类型
  2. unsigned:无符号类型
  3. short:短整型
  4. long:长整型
  5. long long:长长整型(C++11)

2. signed 修饰符

signed修饰符表示有符号类型,可以存储正数、负数和零。对于整型,signed是默认的。

2.1 基本用法

cpp
#include <iostream>

int main() {
    signed int a = -10;     // 有符号整型
    signed char b = -5;     // 有符号字符型
    signed short c = -100;  // 有符号短整型
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    
    return 0;
}

3. unsigned 修饰符

unsigned修饰符表示无符号类型,只能存储非负数(包括零)。

3.1 基本用法

cpp
#include <iostream>

int main() {
    unsigned int a = 10;      // 无符号整型
    unsigned char b = 255;    // 无符号字符型
    unsigned short c = 1000;  // 无符号短整型
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    
    return 0;
}

3.2 signed 与 unsigned 的区别

类型大小(字节)取值范围
signed char1-128 到 127
unsigned char10 到 255
signed short2-32768 到 32767
unsigned short20 到 65535
signed int4-2147483648 到 2147483647
unsigned int40 到 4294967295

3.3 使用场景

  • 有符号类型:用于可能需要存储负数的场景,如温度、余额等
  • 无符号类型:用于只需要存储非负数的场景,如年龄、数量、索引等
cpp
#include <iostream>

int main() {
    // 有符号类型:可能为负数
    signed int temperature = -10;
    signed int balance = -100;
    
    // 无符号类型:只可能为非负数
    unsigned int age = 20;
    unsigned int count = 100;
    unsigned int index = 0;
    
    std::cout << "温度: " << temperature << std::endl;
    std::cout << "余额: " << balance << std::endl;
    std::cout << "年龄: " << age << std::endl;
    std::cout << "数量: " << count << std::endl;
    std::cout << "索引: " << index << std::endl;
    
    return 0;
}

4. short 修饰符

short修饰符表示短整型,占用较少的内存空间。

4.1 基本用法

cpp
#include <iostream>

int main() {
    short a = 1000;
    short int b = 2000;
    signed short c = -1000;
    unsigned short d = 1000;
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;
    
    std::cout << "short 的大小: " << sizeof(short) << " 字节" << std::endl;
    
    return 0;
}

4.2 使用场景

short类型适用于存储范围较小的整数,可以节省内存空间:

cpp
#include <iostream>

int main() {
    short age = 20;           // 年龄范围小,使用 short
    short month = 3;         // 月份范围小,使用 short
    short day = 15;          // 日期范围小,使用 short
    
    std::cout << "年龄: " << age << std::endl;
    std::cout << "月份: " << month << std::endl;
    std::cout << "日期: " << day << std::endl;
    
    return 0;
}

5. long 修饰符

long修饰符表示长整型,占用较多的内存空间。

5.1 基本用法

cpp
#include <iostream>

int main() {
    long a = 1000000L;
    long int b = 2000000L;
    signed long c = -1000000L;
    unsigned long d = 1000000UL;
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;
    
    std::cout << "long 的大小: " << sizeof(long) << " 字节" << std::endl;
    
    return 0;
}

5.2 使用场景

long类型适用于存储范围较大的整数:

cpp
#include <iostream>

int main() {
    long population = 10000000L;        // 人口数量大,使用 long
    long distance = 1000000L;          // 距离大,使用 long
    long timestamp = 1700000000L;      // 时间戳大,使用 long
    
    std::cout << "人口: " << population << std::endl;
    std::cout << "距离: " << distance << std::endl;
    std::cout << "时间戳: " << timestamp << std::endl;
    
    return 0;
}

6. long long 修饰符(C++11)

long long修饰符表示长长整型,占用更多的内存空间,可以存储非常大的整数。

6.1 基本用法

cpp
#include <iostream>

int main() {
    long long a = 10000000000LL;
    long long int b = 20000000000LL;
    signed long long c = -10000000000LL;
    unsigned long long d = 10000000000ULL;
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;
    
    std::cout << "long long 的大小: " << sizeof(long long) << " 字节" << std::endl;
    
    return 0;
}

6.2 使用场景

long long类型适用于存储非常大的整数:

cpp
#include <iostream>

int main() {
    long long big_number = 9223372036854775807LL;  // long long 的最大值
    long long file_size = 1000000000000LL;         // 文件大小
    long long memory_address = 0x7FFFFFFFFFFFFFFFLL;  // 内存地址
    
    std::cout << "大数: " << big_number << std::endl;
    std::cout << "文件大小: " << file_size << std::endl;
    std::cout << "内存地址: " << memory_address << std::endl;
    
    return 0;
}

7. 修饰符的组合

修饰符可以组合使用,但需要注意一些限制。

7.1 合法的组合

cpp
#include <iostream>

int main() {
    signed short a = 1000;
    unsigned short b = 1000;
    signed long c = 1000000L;
    unsigned long d = 1000000UL;
    signed long long e = 10000000000LL;
    unsigned long long f = 10000000000ULL;
    
    std::cout << "a = " << a << std::endl;
    std::cout << "b = " << b << std::endl;
    std::cout << "c = " << c << std::endl;
    std::cout << "d = " << d << std::endl;
    std::cout << "e = " << e << std::endl;
    std::cout << "f = " << f << std::endl;
    
    return 0;
}

7.2 非法的组合

cpp
// 以下组合是非法的
// long short a;      // 错误
// long long short b;  // 错误

8. 数据类型的大小

可以使用sizeof运算符来获取数据类型的大小:

cpp
#include <iostream>

int main() {
    std::cout << "char 的大小: " << sizeof(char) << " 字节" << std::endl;
    std::cout << "short 的大小: " << sizeof(short) << " 字节" << std::endl;
    std::cout << "int 的大小: " << sizeof(int) << " 字节" << std::endl;
    std::cout << "long 的大小: " << sizeof(long) << " 字节" << std::endl;
    std::cout << "long long 的大小: " << sizeof(long long) << " 字节" << std::endl;
    
    std::cout << "unsigned char 的大小: " << sizeof(unsigned char) << " 字节" << std::endl;
    std::cout << "unsigned short 的大小: " << sizeof(unsigned short) << " 字节" << std::endl;
    std::cout << "unsigned int 的大小: " << sizeof(unsigned int) << " 字节" << std::endl;
    std::cout << "unsigned long 的大小: " << sizeof(unsigned long) << " 字节" << std::endl;
    std::cout << "unsigned long long 的大小: " << sizeof(unsigned long long) << " 字节" << std::endl;
    
    return 0;
}

9. 数据类型的取值范围

可以使用<climits>头文件中的宏来获取数据类型的取值范围:

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;
}

10. 示例:综合运用

现在,让我们看一个综合运用各种修饰符的例子:

cpp
#include <iostream>
#include <climits>

int main() {
    // signed 修饰符
    signed int signed_int = -100;
    signed char signed_char = -10;
    
    // unsigned 修饰符
    unsigned int unsigned_int = 100;
    unsigned char unsigned_char = 255;
    
    // short 修饰符
    short short_int = 1000;
    unsigned short unsigned_short = 1000;
    
    // long 修饰符
    long long_int = 1000000L;
    unsigned long unsigned_long = 1000000UL;
    
    // long long 修饰符
    long long long_long_int = 10000000000LL;
    unsigned long long unsigned_long_long = 10000000000ULL;
    
    // 输出各种修饰符的值
    std::cout << "signed int: " << signed_int << std::endl;
    std::cout << "signed char: " << signed_char << std::endl;
    std::cout << "unsigned int: " << unsigned_int << std::endl;
    std::cout << "unsigned char: " << unsigned_char << std::endl;
    std::cout << "short: " << short_int << std::endl;
    std::cout << "unsigned short: " << unsigned_short << std::endl;
    std::cout << "long: " << long_int << std::endl;
    std::cout << "unsigned long: " << unsigned_long << std::endl;
    std::cout << "long long: " << long_long_int << std::endl;
    std::cout << "unsigned long long: " << unsigned_long_long << std::endl;
    
    // 输出各种修饰符的大小
    std::cout << "\n数据类型的大小:" << std::endl;
    std::cout << "signed int: " << sizeof(signed int) << " 字节" << std::endl;
    std::cout << "signed char: " << sizeof(signed char) << " 字节" << std::endl;
    std::cout << "unsigned int: " << sizeof(unsigned int) << " 字节" << std::endl;
    std::cout << "unsigned char: " << sizeof(unsigned char) << " 字节" << std::endl;
    std::cout << "short: " << sizeof(short) << " 字节" << std::endl;
    std::cout << "unsigned short: " << sizeof(unsigned short) << " 字节" << std::endl;
    std::cout << "long: " << sizeof(long) << " 字节" << std::endl;
    std::cout << "unsigned long: " << sizeof(unsigned long) << " 字节" << std::endl;
    std::cout << "long long: " << sizeof(long long) << " 字节" << std::endl;
    std::cout << "unsigned long long: " << sizeof(unsigned long long) << " 字节" << std::endl;
    
    // 输出各种修饰符的取值范围
    std::cout << "\n数据类型的取值范围:" << 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;
}

小结

C++ 修饰符类型包括:

  1. signed:有符号类型,可以存储正数、负数和零
  2. unsigned:无符号类型,只能存储非负数
  3. short:短整型,占用较少的内存空间
  4. long:长整型,占用较多的内存空间
  5. long long:长长整型,占用更多的内存空间(C++11)

关键概念:

  • 修饰符的组合:修饰符可以组合使用,但需要注意一些限制
  • 数据类型的大小:可以使用sizeof运算符获取
  • 数据类型的取值范围:可以使用<climits>头文件中的宏获取

选择合适的修饰符对于编写高效、正确的程序非常重要。在后续章节中,我们将学习 C++ 的存储类。