Appearance
C++ 修饰符类型
C++ 提供了多种类型修饰符,用于修改基本数据类型的行为。这些修饰符可以改变数据类型的存储大小、取值范围或符号属性。
1. 类型修饰符概述
C++ 的类型修饰符包括:
- signed:有符号类型
- unsigned:无符号类型
- short:短整型
- long:长整型
- 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 char | 1 | -128 到 127 |
unsigned char | 1 | 0 到 255 |
signed short | 2 | -32768 到 32767 |
unsigned short | 2 | 0 到 65535 |
signed int | 4 | -2147483648 到 2147483647 |
unsigned int | 4 | 0 到 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++ 修饰符类型包括:
- signed:有符号类型,可以存储正数、负数和零
- unsigned:无符号类型,只能存储非负数
- short:短整型,占用较少的内存空间
- long:长整型,占用较多的内存空间
- long long:长长整型,占用更多的内存空间(C++11)
关键概念:
- 修饰符的组合:修饰符可以组合使用,但需要注意一些限制
- 数据类型的大小:可以使用
sizeof运算符获取 - 数据类型的取值范围:可以使用
<climits>头文件中的宏获取
选择合适的修饰符对于编写高效、正确的程序非常重要。在后续章节中,我们将学习 C++ 的存储类。