C语言整数类型
整数是编程中常用的一种数据C语言通常使用int来定义整数int 是 integer 的简写。在现代操作系统中int一般占用 4 个字节Byte的内存共计 32 位Bit。如果不考虑正负数当所有的位都为 1 时它的值最大为 232-1 4,294,967,295 ≈ 43亿这是一个很大的数实际开发中很少用到而诸如 18、520、1024 等较小的数使用频率反而较高。使用 4 个字节保存较小的整数绰绰有余会空闲出两三个字节来这些字节就白白浪费掉了不能再被其他数据使用。现在个人电脑的内存都比较大了配置低的也有 2G浪费一些内存不会带来明显的损失而在C语言被发明的早期或者在低端单片机中内存都是非常稀缺的资源所有的程序都在尽力节省内存。反过来说43 亿虽然已经很大但要表示全球人口数量还是不够必须要让整数占用更多的内存才能表示更大的值比如占用 6 个字节或者 8 个字节。让整数占用更少的内存可以在 int 前边加short让整数占用更多的内存可以在 int 前边加long还不够的话可以在 int 前面加两个 long例如short int a 18; short int b, c 520; long int m 102023; long int n, p 562131; long long int x 12233720; long long int y, z 92949685;这样 a、b、c 各自只占用 2 个字节的内存m、n、p可能占用 8 个字节x、y、z 各自占用 8 个字节。也可以将 int 省略只写 short、long 和 long long如下所示short a 18; short b, c 520; long m 102023; long n, p 562131; long long x 12233720; long long y, z 92949685;这样的写法更加简洁实际开发中常用。int 是基本的整数类型short、long 和 long long 是在 int 的基础上进行的扩展short 可以节省内存long 和 long long 可以容纳更大的值。short、int、long 是C语言中常见的整数类型long long 在某些场景中也会用到。其中int 称为整型short 称为短整型long 称为长整型long long 称为超长整形。整型的长度细心的读者可能会发现上面我们在描述 short、int、long、long long 类型的长度时只对 short 和 long long 使用肯定的说法而对 int、long 使用了“一般/可能”等不确定的说法。这种描述的言外之意是short 和 long long 的长度是确定的分别是 2 和 8 个字节而 int、long 的长度无法确定在不同的环境下有不同的表现。一种数据类型占用的字节数称为该数据类型的长度。例如short 占用 2 个字节的内存那么它的长度就是 2。实际情况也确实如此C语言并没有严格规定 short、int、long、long long 的长度只做了宽泛的限制short 至少占用 2 个字节。int 建议为一个机器字长。32 位环境下机器字长为 4 字节64 位环境下机器字长为 8 字节。short 的长度不能大于 intlong 的长度不能小于 intlong long 不能小于 long。总结起来它们的长度所占字节数关系为2 ≤ short ≤ int ≤ long ≤ long long这就意味着short 并不一定真的“短”long 也并不一定真的“长”它们有可能和 int 占用相同的字节数。同样long long 也不一定真的比 long 长它们占用的字节数可能相同。在 16 位环境下short 的长度为 2 个字节int 也为 2 个字节long 为 4 个字节long long 为 8 个字节。在单片机/嵌入式领域16 位环境很少使用了一般使用 8/32/64 位环境在 PC 和服务器领域16 位环境早就已经消失了。对于 32 位的 Windows、Linux 和 macosshort 的长度为 2 个字节int 为 4 个字节long 也为 4 个字节long long 为 8 个字节。PC 和服务器上的 32 位操作系统占有率越来越低基本都被 64 位替代了而单片机/嵌入式领域使用 32 位环境越来越多了8 位环境越来越少了。在 64 位环境下不同的操作系统会有不同的结果如下所示操作系统shortintlonglong longWin6464位 Windows2448类Unix系统包括 Unix、Linux、macOS、BSD、Solaris 等2488目前我们使用较多的 PC 系统为 Win 7/8/10/11、macOS、Linux在这些系统中short、int 和 long long 的长度都是固定的分别为 2、4 和 8大家可以放心使用只有 long 的长度在 Win64 和类 Unix 系统下会有所不同使用时要注意移植性。sizeof 操作符获取某个数据类型的长度可以使用 sizeof 操作符如下所示 #include stdio.h int main() { short a 10; int b 100; int short_length sizeof a; int int_length sizeof(b); int long_length sizeof(long); int longlong_length sizeof(long long); printf(short%d, int%d, long%d, longlong%d\n, short_length, int_length, long_length, longlong_length); return 0; } 在 32 位环境以及 Win64 环境下的运行结果为short2, int4, long4, longlong8在 64 位 Linux 和 macOS 下的运行结果为short2, int4, long8, longlong8sizeof 用来获取某个数据类型或变量所占用的字节数如果后面跟的是变量名称那么可以省略( )如果跟的是数据类型就必须带上( )。需要注意的是sizeof 是C语言中的操作符不是函数所以可以不带( )后面会详细讲解。不同整型的输出使用不同的格式控制符可以输出不同类型的整数它们分别是%hd用来输出 short int 类型hd 是 short decimal 的简写%d用来输出 int 类型d 是 decimal 的简写%ld用来输出 long int 类型ld 是 long decimal 的简写%lld用来输出 long long int 类型lld 是 long long decimal 的简写。下面的例子演示了不同整型的输出#include stdio.h int main() { short a 18; int b 520; long c 1024; long long d 102023; printf(a%hd, b%d, c%ld, d%lld\n, a, b, c, d); return 0; }运行结果a18, b520, c1024, d102023在编写代码的过程中我建议将格式控制符和数据类型严格对应起来养成良好的编程习惯。当然如果你不严格对应一般也不会导致错误例如很多初学者都使用%d输出所有的整数类型请看下面的例子#include stdio.h int main() { short a 18; int b 520; long c 1024; long long d 102023; printf(a%d, b%d, c%d, d%d\n, a, b, c, d); return 0; }运行结果仍然是a18, b520, c1024, d102023当使用%d输出 short或者使用%ld输出 short、int又或者使用%lld输出 short、int 和 long 时不管值有多大都不会发生错误因为格式控制符足够容纳这些值。当使用%hd输出 int、long、long long或者使用%d输出 long、long long又或者使用%ld输出 long long 时如果要输出的值比较小就像上面的情况一般也不会发生错误如果要输出的值比较大就很有可能发生错误例如#include stdio.h int main() { int m 306587; long n 28166459852; printf(m%hd, n%hd\n, m, n); printf(n%d\n, n); return 0; }在 64 位 Linux 和 macOS 下long 的长度为 8的运行结果为m-21093, n4556 n-1898311220输出结果完全是错误的这是因为%hd容纳不下 m 和 n 的值%d也容纳不下 n 的值。感兴趣的话还可以在 Windows 环境中测试用%ld输出较大的 long long 类型整数比如 28166459852会发现输出结果也是错误的。读者需要注意当格式控制符和数据类型不匹配时编译器会给出警告提示程序员可能会存在风险。编译器的警告是分等级的不同程度的风险被划分成了不同的警告等级而使用%d输出 short、long 和 long long 类型的风险较低如果你的编译器设置只对较高风险的操作发出警告那么此处你就看不到警告信息。不同整形的后缀读到这里大家已经学完了 short、int、long 和 long long 四种整数类型假设程序中有一个整数 100它是什么类型的呢实际开发中用到的整数它们的值通常不会很大类型默认为 int。如果整数的值很大需要占用比 int 更多的内存它的类型可能是 long、long long 等还可能是无符号整形后续会讲。举个简单的例子long a 100; int b 294;单纯看 100 和 294 这两个整数它们的类型都是 int。分析这两行代码第一行变量 a 的类型是 long整数 100 的类型是 int它们的类型不同编译器会先将 100 的类型转换成 long再将它赋值给 a第二行变量 b 的类型是 int整数 294 的类型是 int它们的类型相同编译器直接将 294 赋值给变量 b。关于数据类型的转换这里先简单了解一下我们将在《C语言数据类型转换》一节中深入探讨。对于数值不是很大的整数我们也可以手动指定它们的类型为 long 和 long long具体写法是整数后面紧跟 l小写的 L或者 L表明它的类型是 long整数后面紧跟 ll小写的 LL或者 LL表明它的类型是 long long。举个简单的例子int a 10; long b 100L; long long c 1000LL; short d 32L;其中10 的类型是 int100 和 32 的类型是 long1000 的类型是 long long。我们习惯把 L、LL 这样的类型标识叫做整数的后缀。再次强调一个整数赋值给某个变量时它们的类型不一定相同比如将 100L 赋值给 b它们的类型是相同的再比如将 32L 赋值给 d它们的类型是不同的编译器会先将 32 转换为 short 类型然后再赋值给 d。对于初学者很少会用到数字的后缀加不加往往没有什么区别也不影响实际编程。但是既然系统地学习 C语言这个知识点还是要掌握的否则哪天看到别人的代码这样写你却不明白怎么回事那就尴尬了。