今天写了一道算法题,碰到long int类型定义的变量,竟然不知道什么意思。。。 查资料,总结分享如下:
int数据类型的位数为16位,short int数据类型的位数也是16位。而long int的位数为32位,可用来存储比较大的整数。
short int 和 long int可以缩写为short 和 long。
C语言中的整型数据类型int、short int 和 long int
名称 | 全称类型说明符 | 缩写类型说明符 | 位数 | 范围 |
---|---|---|---|---|
整型 | int | int | 16位 | -32768至+32767 |
无符号整型 | unsigned int | unsigned | 16位 0 至 65,535 | |
短整型 | short int | short | 16位 | -32768至+32767 |
无符号短整型 | unsigned short int | unsigned short | 16位 | 0 至 65,535 |
长整型 | long int | long | 32位 | -2,147,483,648 至 2,147,483,647 |
|无符号长整型 |unsigned long int | unsigned long | 32位 | 0至4,294,967,295|
整型变量的声明方式:
int sum;
long int population;
unsigned int sum;
在一个语句中声明多个属于同一类型的变量:
int withd, height;
int 类型的变量初始化方式:
withd = 150; //前面已经声明,在此进行初始化
int height = 60; //直接在一个语句中进行声明和初始化
C语言中整型常量有三种不同的表示形式:
1、八进制整型常量:在八进制数值前面加前缀“0”,其数码取值为0~7。例如:054、0567、05421。
2、十六进制整型常量:前缀为“0X”或“0x“,其数码取值为0~9、A~F 或 a~f。例如:0X3D、0XE0、0xfff等。
3、十进制整型常量:既无前缀也无后缀。例如:254、745、890等。 如将存储为long类型,需要在数字序列最后附一个字母L 或 l 作为后缀。例如:245L、7850L、124l等
1. 其它整数类型
int 是 C 语言的基本整数类型,可以满足我们处理一般数据的需求。C 语言还提供了四个可以修饰 int 的关键字:short、long、signed,以及 unsigned。利用这四个关键字,C 语言标准定义了以下整数类型:
1) short int(可简写为 short),和 int 一样,也是有符号整数
2) long int(简写:long),有符号整数
3) long long int(简写:long long),C99 标准添加的类型,
有符号整数
4) unsigned int(简写:unsigned),无符号整数,不能表示负数
5) unsigned long int(简写:unsigned long),无符号整数,
不能表示负数
6) unsigned short int(简写:unsigned short),无符号整数,
不能表示负数
7) unsigned long long int(简写:unsigned long long),
C99 添加的类型,无符号整数
8) 所有没有标明 unsigned 的整数类型默认都是有符号整数。
在这些整数类型前面加上 signed 可以使读者更清楚地知道
这些是有符号整数,尽管有没有 signed 都表示有符号整数。
例如:signed int 等同于 int 。
一般我们把 short 称为短整型,把 long 称为长整型,把 long long 称为超长整型,把 int 称为整型。unsigned 打头的那些整数类型统称为无符号整型。例如:我们称 unsigned short 为无符号短整型。以此类推。
声明方式
这些整数类型的声明方式与 int 类型的声明方式一样。例如:
long int estine;
long johns;
short int erns;
short ribs;
unsigned int s_count;
unsigned players;
unsigned long headcount;
unsigned short yesvotes;
long long ago; /* C99 特有 */
unsigned long long ego; /* C99 特有 */
如果您的编译器不支持 C99 标准,那就不能使用 long long 和 unsigned long long。取值范围(表示范围)
标准也规定了这些整数类型的最小取值范围。short 的最小表示范围和 int 一样,都是-32767 到 32767 。也就是 -(2^15 - 1)到(2^15 - 1)。其中,2^15表示 2 的 15 次方。类似地,2 的 20 次方记作2^20 ,以此类推。注意:C 语言中 2^15 并不表示 2 的 15 次方,为了书写方便,我们姑且这么表示。long 的最小取值范围是 -2147483647 到 2147483647 。也就是 -(2^31 - 1) 到 (2^31 - 1) 。unsigned short的最小表示范围和unsigned int 一样,都是 0 到 65535(2^16 - 1)。unsigned long 的最小取值范围是 0 到 4294967295(2^32 - 1)。long long的最小取值范围是 -9223372036854775807(-(2^63 - 1))到 9223372036854775807(2^63 - 1);unsigned long long 是 0 到 18446744073709551615(2^64 - 1)。
标准规定,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 来获取。例如:
printf( “%lu\n”, (unsigned long)sizeof(int) * 8 ); /* 输出 int 的位数 */
printf( “%zu\n”, sizeof(short) * 8 ); /* 输出 short 的位数 */
sizeof 运算符返回其操作数占用空间的大小,以字节(Byte)为单位。注意,C 定义字节的大小为 char 类型的大小。char 通常是 8 位(bit)的,当然也可以更大。这里我们假设 char 是 8 位的。点击查看 char 类型详细介绍
sizeof 的用法我们以后会讲到,现在只要有个印象就好了。第二句中的 %zu 是 C99 特有的,如果您的编译器不支持 C99(准确地说,应该是如果您的编译器使用的库函数不支持 C99),运行结果将会出错。整数类型的选择
如果您要处理的只是非负整数,那么应该优先使用 unsigned 打头的那些整数类型。如果您要处理的整数超出了 int 所能表示的范围,并且您的编译器中,long 的表示范围比 int 大,那就使用 long。不过,若非必要,尽量不要用 long,因为它可能会降低程序运行效率。有一点要注意:如果您的编译器中,long 和 int 都是 32 位的,并且您需要使用 32 位整数,那么应该用 long,而不要用 int。只有这样,我们的程序才可以安全地移植到 16 位的计算机,因为 16 位的计算机中,int 一般也是 16 位的。类似地,如果您需要使用 64 位整数,那就用 long long。如果 int 是 32 位的话,那么使用 short 可以节省空间,不过您得确保您要处理的整数不会超出 short 的表示范围。这种“节省”对内存大的计算机来说,是没什么意义的。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 。
这些后缀也可以用于十六进制和八进制整数常量。例如:020L,010LL,0x30uL,0x40ull 。
参考资料:C Primer Plus, 5th Edtion By Stephen Prata
The C Programming Language 2e By K&R
C99 标准
整型常量
十进制、八进制和十六进制的整型常量可加后缀以指示类型,如下表所示。
表 2–1 数据类型后缀
后缀 | 类型 |
---|---|
u 或 U | unsigned |
l或L | long |
ll 或 LL | long long [long long 和 unassigned long long 在 -xc99=none 和 -Xc 模式下不可用。] |
lu、LU、Lu、lU、ul、uL、Ul 或 UL | unsigned long |
llu、LLU、LLu、llU、ull、ULL、uLL、 Ull | unsigned long long |
如果设置 -xc99=all,编译器将根据常量大小,使用以下列表中可以表示该值的第一项:
int
long int
long long int
如果值超过 long long int 可表示的最大值,编译器会发出警告。
如果设置 -xc99=none,则为无后缀常量指定类型时,编译器将根据常量大小,使用以下列表中可以表示该值的第一项:
int
long int
unsigned long int
long long int
unsigned long long int