首页 > 编程笔记 > C语言笔记

C语言整数类型汇总(包含区别和取值范围)

C语言中的整型数据类型如下表所示。

表 1 C语言中的整型数据类型
类型名称 C语言中的关键字 注 释
字符型 char 用于表示很小的整数
短整型 short 用于表示不怎么大的整数
整型 int 可以表示生活中的一般整数
长整型 long 用于表示较大的整数
加长整型 long long 用于表示非常大的整数
举个简单的例子:
char q = 5;
short a = 10;
short b, c = 99;
long m = 102023;
long n, p = 562131;
long long x = 12233720;
long long y, z = 92949685;

读者可能会好奇,为什么需要定义这么多不同类型的整数呢?

实际上,计算机通过晶体管的开关状态来记录数据。晶体管通常会被分为 8 个一组,我们称之为字节。由于晶体管只有两种状态,每个字节就可以拥有 2 的 8 次方种不同的状态。让每个状态对应一个数值,就可以表示 256 个不同的数值。

下图清楚地展示了不同晶体管状态和它们所表示的数值。


图 1 晶体管状态和表示的数值

这里涉及到二进制的知识,如果你对于二进制还不太了解,建议先学习二进制的内容。

要表示更大的数值范围就需要更多的晶体管。在 C语言刚刚发明的时代,计算机存储资源是非常宝贵且稀缺的。对于程序员来说,他们可能希望将存储区域“掰成两半”来使用。例如,如果只需要表示 0~100 的数字,那么一个字节就足够了,为什么要使用两个字节呢?

即使如今存储资源更加丰富,但许多编程语言仍然延续了这个传统。它们都提供了许多数据类型供选择。在编写代码时,程序员通常可以预测需要使用的数值范围。因此,在处理数据时,可以从语言提供的类型中选择最合适的类型存储数据。

你可能想了解这些整型数据类型占用了多少字节,以及它们的具体数值范围。但很遗憾,我们无法准确地告诉你,因为 C语言标准没有规定这些数据类型的大小范围,具体的实现取决于编译器和平台。那么,我们应该如何知道在 Visual Studio 中各种整型数据类型可以表示的数值范围呢?

可以使用 sizeof 关键字测量。

sizeof测量大小

和 int 一样,sizeof 也是 C语言中的一个关键字。它由英语单词 size 和 of 组成,它的翻译意思是“大小”,可以测量 C语言中各种实体所占用的字节数。

如果测量 int 类型占用的字节数,可以按照以下方式编写代码:
sizeof(int);
该行代码返回 int 类型的字节数。我们可以使用 printf 函数将结果显示在控制台上。假设 sizeof 返回 int 类型的值,并在 printf 函数中使用占位符 %d 输出它。更准确的方法是使用 %zu 占位符。以下是测量 int 类型占用的字节数并在控制台上输出结果的代码。
printf("%d\n", sizeof(int));
sizeof 关键字可以与类型、变量和常量一起使用:
注意,以下代码省略了 main 函数,只把其中重要的部分提取出来进行讲解,你在实际编写代码时,必须加上 main 函数。

下面的程序展示了如何使用 sizeof 来测量 C 语言中不同类型所占用的字节数。
int a;
printf("sizeof int = %d\n", sizeof(int));  //测量类型占用的字节数
printf("sizeof a = %d\n", sizeof(a));      //测量变量类型占用的字节数
printf("sizeof 123 = %d\n", sizeof(123));  //测量常量类型占用的字节数

现在,我们可以编写程序来检查 C语言中不同整型类型所占用的字节数。
printf("sizeof char=%d\n", sizeof(char));
printf("sizeof short=%d\n", sizeof(short));
printf("sizeof int=%d\n", sizeof(int));
printf("sizeof long=%d\n", sizeof(long));
printf("sizeof long long=%d\n", sizeof(long long));
在运行程序后,我们可以看到它输出的结果:

sizeof char=1
sizeof short=2
sizeof int=4
sizeof long=4
sizeof long long=8


接下来,我们将继续讨论各种数据类型能够表达的数值范围的具体细节。

整型的数值范围

每个整型类型的数值范围可参见下表。

表 2 C语言中整型的数值范围
类  型 sizeof大小 二进制位数 取值范围算式 数值范围
char 1 1x8=8 位 -2^7 ~ 2^7-1 -128 ~ 127
short 2 2x8=16 位 -2^15 ~ 2^15-1 -32768 ~ 32767
int 4 4x8=32 位 -2^31 ~ 2^31-1 -2147483648 ~ 2147483647
long 4 4x8=32 位 -2^31 ~ 2^31-1 -2147483648 ~ 2147483647
long long 8 8x8=64 位 -2^63 ~ 2^63-1 -9223372036854775808 ~ 9223372036854775807

无符号整型

无符号整型(unsigned int)是 C语言中的一种整数类型,用于存储非负整数。与有符号整型(int)不同,无符号整型只存储非负整数,因此其值域比有符号整型更大。

为声明无符号整型,需要在整型前加上关键字 unsigned,例如:
unsigned int a;
如果你确定你不会用到负数,则建议你使用 unsigned 关键字,表明该数据类型不带有符号位。由于不带符号位,原本留给符号位的二进制位可用来表示数值,因此可以有效地表示比有符号整型更大的值。

下表中列出了无符号整型的数值范围。

表 3 C语言中的无符号整型的数值范围
类  型 sizeof大小 二进制位数 取值范围算式 数值范围
unsigned char 1 1x8=8 位 0 ~ 2^8-1 0 ~ 255
unsigned short 2 2x8=16 位 0 ~ 2^16-1 0 ~ 65535
unsigned int 4 4x8=32 位 0 ~ 2^32-1 0 ~ 4294967295
unsigned long 4 4x8=32 位 0 ~ 2^32-1 0 ~ 4294967295
unsigned long long 8 8x8=64 位 0 ~ 2^64-1 0 ~ 18446744073709551615

声明:《C语言系列教程》为本站“54笨鸟”官方原创,由国家机构和地方版权局所签发的权威证书所保护。