标准规定,Int 的表示范围不能小于 Short 的表示范围,Long 的表示范围不能小于 Int 的表示范围。这就是说 Short 型变量占用的空间可能比 Int 型变量少,而 Long 型变量占用的空间可能比 Int 型变量多。16 位(Bit)的计算机中,Int 和 Short 一般都是 16 位,而 Long 是 32位;32位的计算机中,Short一般是 16 位,而Long和Int是 32位。TC2(16位的编译器)中,Int是16位的;而 Dev-C++(32 位的编译器)中,Int 是 32 位的。
使用 Unsigned Int 声明的变量只能表示非负整数(0 和正整数)。如果 Int 是 16 位的话,那么 Unsigned Int 的表示范围是 0 到 65535(2^16 - 1)。这是因为 Unsigned 不需要符号位,可以把 16 个位全都用于表示整数。而 Int 需要一个位作为符号位,用于表示正负,只有 15 个位用于表示整数。
目前,Long Long 一般 64 位,Long 是 32 位,Short 是 16 位,而 Int 或者 16 位,或者 32 位。具体某个编译器到底使用多少位来表示这些类型,我们可以用运算符 Sizeof 来获取。例如:
如果您要处理的只是非负整数,那么应该优先使用 Unsigned 打头的那些整数类型。如果您要处理的整数超出了 Int 所能表示的范围,并且您的编译器中,Long 的表示范围比 Int 大,那就使用 Long。不过,若非必要,尽量不要用 Long,因为它可能会降低程序运行效率。有一点要注意:如果您的编译器中,Long 和 Int 都是 32 位的,并且您需要使用 32 位整数,那么应该用 Long,而不要用 Int。只有这样,我们的程序才可以安全地移植到 16 位的计算机,因为 16 位的计算机中,Int 一般也是 16 位的。类似地,如果您需要使用 64 位整数,那就用 Long Long。如果 Int 是 32 位的话,那么使用 Short 可以节省空间,不过您得确保您要处理的整数不会超出 Short 的表示范围。这种“节省”对内存大的计算机来说,是没什么意义的。
5. Long 型常量和 Long Long 型常量
一般来说,整数常量是被当作 Int 类型来存储的。如果我们使用的整数常量超出了 Int 的表示范围,C 语言规定编译器自动使用 Unsigned Int 来处理这个常量。如果 Unsigned 也不足以表示这个常量的话,编译器就会用 Long。如果还表示不了的话,那就依次用 Unsigned Long,Long Long,Unsigned Long Long。如果 Unsigned Long Long 也表示不了,那么编译器就没辙了。注意:Long Long 和 Unsigned Long Long 是 C99 特有的。例如:如果 Int 是 16 位的话,它就表示不了常量 1000000。编译器会使用 Long 来处理这个常量,因为 Unsigned Int 也表示不了 1000000 。
同样,十六进制和八进制整数常量通常也是被作为 Int 来处理。但是,当我们使用的常量超出了 Int 的表示范围后,编译器会依次使用Unsigned Int,Long,Unsigned Long,Long Long 和 Unsigned Long Long。直到所使用的类型足以表示那个常量为止。
有时,我们使用的是较小的常量,但是我们希望这个常量被当作 Long 来处理,这就需要在这个常量后面加上后缀 L(小写字母 L)或者 L(大写字母 L)。我们应该避免使用 L ,因为 L 容易和数字 1 混淆。例如:整数常量 7 是被作为 Int 来处理的,但整数常量 7L(或者 7l)是被作为 Long 来处理的。类似地,在整数常量后面加上后缀 Ll 或者 LL ,这个常量就会被当作 Long Long 来处理。例如:3LL 。如果想使用无符号整数常量的话,还要配合使用后缀 U 或者 U 。例如:2u,3U,4Lu,5ul,6LU,7LLU,8Ull,9uLL 。