C语言整型数据类型详解:从short到long long
2.2.1 整型数据类型1. 整型数据类型概述整型数据类型是编程中最基础、使用最频繁的数据类型之一。就像数学中的整数集合一样整型用来表示没有小数部分的数值。在我们的日常生活中有很多信息都可以用整数来表示年龄、人数、商品数量、分数等等。在C语言中整型不是只有一种而是一个家族包含了多个成员。这些成员的主要区别在于能够表示的数值范围和占用的内存空间。选择合适的整型就像选择合适大小的容器一样太小了装不下太大了浪费空间。2. 整型家族成员详解short类型短整型short是整型家族中的小弟弟它是为了在内存紧张的情况下节省空间而设计的。在大多数系统中short占用2个字节16位的内存空间。short类型的取值范围通常是-32,768到32,767。为什么是这个范围呢因为16位可以表示2^1665,536种不同的值如果要包括负数就要用一半来表示负数一半来表示非负数。在实际应用中short类型适合存储那些我们确定不会超出其范围的数值。比如学生考试分数0-100月份1-12一天中的小时数0-23温度值在合理范围内需要注意的是在现代计算机中由于内存相对充裕short类型使用得不如以前频繁。但在嵌入式系统中特别是内存非常有限的微控制器中合理使用short可以显著节省内存。int类型基本整型int是整型家族的当家人也是使用最频繁的整型。在现代的32位和64位系统中int通常占用4个字节32位的内存空间取值范围大约是-21亿到21亿准确地说是-2,147,483,648到2,147,483,647。int类型是C语言中的默认整型当我们不确定用哪种整型时int通常是最安全的选择。它的取值范围对于大多数应用来说都是足够的而且在大多数系统上运算效率最高。在嵌入式编程中int类型经常用来表示计数器的值数组的下标循环的次数各种数值计算的结果long类型长整型long是整型家族的大哥设计用来处理更大的数值。但这里要注意一个重要的细节long的实际大小依赖于系统架构。在32位系统中long通常和int一样大都是4个字节。在64位系统中long通常是8个字节可以表示非常大的数值范围。这种差异有时会给跨平台编程带来困扰。注意在写长整型字面量时我们通常在数字后面加上字母L或l这告诉编译器这是一个long类型的数值。建议使用大写的L因为小写的l容易与数字1混淆。long long类型超长整型long long是整型家族的超级大哥是C99标准引入的类型。它在所有支持的系统上都至少占用8个字节64位可以表示的数值范围非常大大约是-9×10^18到9×10^18。注意long long类型的字面量要在数字后面加上LL。long long类型在处理以下情况时特别有用文件大小现代文件可能超过2GB时间戳特别是以毫秒或微秒为单位的时间戳大数值计算加密算法中的大整数运算3. 有符号与无符号整型每种整型都有两个版本有符号signed和无符号unsigned。这是一个非常重要的概念直接影响数值的表示范围。有符号整型默认默认情况下所有整型都是有符号的也就是可以表示正数、负数和零。有符号整型使用最高位作为符号位0表示正数1表示负数。无符号整型无符号整型只能表示零和正数不能表示负数。但由于不需要符号位所以能表示的正数范围翻倍。无符号整型的字面量通常在数字后面加上U或u。有符号与无符号的选择原则选择有符号还是无符号整型需要根据具体应用场景使用有符号整型的情况数值可能为负数温度、余额、坐标等进行减法运算时可能产生负数与其他有符号数值进行比较或运算使用无符号整型的情况数值在逻辑上不可能为负数年龄、数量、大小等需要更大的正数表示范围进行位运算操作表示内存地址或硬件寄存器值4. 整型的字面量表示C语言支持多种进制的整型字面量表示方法这在不同的应用场景中很有用。十进制表示这是最常见的表示方法就是我们日常使用的数字int decimal 123; // 十进制 int negative -456; // 十进制负数八进制表示八进制数以数字0开头int octal 0123; // 八进制相当于十进制的83八进制在现代编程中使用较少但在某些系统编程中仍有应用。十六进制表示十六进制数以0x或0X开头使用数字0-9和字母A-F不区分大小写int hex 0x1A3F; // 十六进制相当于十进制的6719 int hexUpper 0XABCD; // 十六进制相当于十进制的43981十六进制在嵌入式编程中使用很频繁特别是在操作硬件寄存器时。二进制表示C99扩展一些编译器支持二进制字面量以0b或0B开头int binary 0b101010; // 二进制相当于十进制的425. 整型的取值范围和limits.h不同系统和编译器中整型的具体大小可能不同。C语言提供了limits.h头文件定义了各种整型的最大值和最小值常量#include limits.h printf(short 最小值: %d\n, SHRT_MIN); printf(short 最大值: %d\n, SHRT_MAX); printf(int 最小值: %d\n, INT_MIN); printf(int 最大值: %d\n, INT_MAX); printf(long 最小值: %ld\n, LONG_MIN); printf(long 最大值: %ld\n, LONG_MAX); printf(unsigned int 最大值: %u\n, UINT_MAX);6. 整型运算的注意事项溢出问题当运算结果超出数据类型的表示范围时就会发生溢出。溢出是编程中常见的错误源#include stdio.h int main() { short a 32000; short b 1000; short c a b; // 溢出33000超出了short的最大值32767 printf(a %d\n, a); printf(b %d\n, b); printf(c %d (溢出后的错误结果)\n, c); return 0; }在这个例子中32000 1000 33000超出了short的最大值32767会发生溢出。类型提升在进行算术运算时C语言会自动进行类型提升。比如char和short参与运算时会被提升为intchar a 100; char b 50; int c a b; // a和b被提升为int后再相加混合类型运算当有符号和无符号整型混合运算时有符号数会被转换为无符号数这可能导致意外的结果#include stdio.h int main() { int signed_num -1; unsigned int unsigned_num 10; if (signed_num unsigned_num) { printf(-1 10 吗\n); } else { printf(-1 10 吗\n); // 这个会被执行 } return 0; }因为-1被转换为无符号数后变成了一个很大的正数。