- C语言提供了说明长度和说明符号位的两种类型说明符, 这两种类型说明符一共有4个:
- short 短整型 (说明长度)
- long 长整型 (说明长度)
- signed 有符号型 (说明符号位)
- unsigned 无符号型 (说明符号位)
- 这些说明符一般都是用来修饰int类型的,所以在使用时可以省略int
- 这些说明符都属于C语言关键字
- short和long可以提供不同长度的整型数,也就是可以改变整型数的取值范围。
- 在64bit编译器环境下,int占用4个字节(32bit),取值范围是-2^31 ~ 2^31-1;
- short占用2个字节(16bit),取值范围是-2^15 ~ 2^15-1;
- long占用8个字节(64bit),取值范围是-2^63 ~ 2^63-1
- short占2个字节(16位)
- int占4个字节(32位)
- long占8个字节(64位)。
- 因此,如果使用的整数不是很大的话,可以使用short代替int,这样的话,更节省内存开销。
- 世界上的编译器林林总总,不同编译器环境下,int、short、long的取值范围和占用的长度又是不一样的。比如在16bit编译器环境下,long只占用4个字节。不过幸运的是,ANSI \ ISO制定了以下规则:
- short跟int至少为16位(2字节)
- long至少为32位(4字节)
- short的长度不能大于int,int的长度不能大于long
- char一定为为8位(1字节),毕竟char是我们编程能用的最小数据类型
- 可以连续使用2个long,也就是long long。一般来说,long long的范围是不小于long的,比如在32bit编译器环境下,long long占用8个字节,long占用4个字节。不过在64bit编译器环境下,long long跟long是一样的,都占用8个字节。
#include <stdio.h>
int main()
{
char num = 129;
printf("size = %i\n", sizeof(num));
printf("num = %i\n", num);
short int num1 = 32769;
printf("size = %i\n", sizeof(num1));
printf("num1 = %hi\n", num1);
int num2 = 12345678901;
printf("size = %i\n", sizeof(num2));
printf("num2 = %i\n", num2);
long int num3 = 12345678901;
printf("size = %i\n", sizeof(num3));
printf("num3 = %ld\n", num3);
long long int num4 = 12345678901;
printf("size = %i\n", sizeof(num4));
printf("num4 = %lld\n", num4);
short num5 = 123;
printf("num5 = %lld\n", num5);
long num6 = 123;
printf("num6 = %lld\n", num6);
long long num7 = 123;
printf("num7 = %lld\n", num7);
return 0;
}
- 首先要明确的:signed int等价于signed,unsigned int等价于unsigned
- signed和unsigned的区别就是它们的最高位是否要当做符号位,并不会像short和long那样改变数据的长度,即所占的字节数。
- signed:表示有符号,也就是说最高位要当做符号位。但是int的最高位本来就是符号位,因此signed和int是一样的,signed等价于signed int,也等价于int。signed的取值范围是-2^31 ~ 2^31 - 1
- unsigned:表示无符号,也就是说最高位并不当做符号位,所以不包括负数。
- 因此unsigned的取值范围是:0000 0000 0000 0000 0000 0000 0000 0000 ~ 1111 1111 1111 1111 1111 1111 1111 1111,也就是0 ~ 2^32 - 1
#include <stdio.h>
int main()
{
int num1 = 9;
int num2 = -9;
int num3 = 0;
printf("num1 = %i\n", num1);
printf("num2 = %i\n", num2);
printf("num3 = %i\n", num3);
signed int num4 = 9;
signed int num5 = -9;
signed int num6 = 0;
printf("num4 = %i\n", num4);
printf("num5 = %i\n", num5);
printf("num6 = %i\n", num6);
signed num7 = 9;
printf("num7 = %i\n", num7);
unsigned int num8 = -9;
unsigned int num9 = 0;
unsigned int num10 = 9;
printf("num8 = %u\n", num8);
printf("num9 = %u\n", num9);
printf("num10 = %u\n", num10);
return 0;
}
- 修饰符号的说明符可以和修饰长度的说明符混合使用
- 相同类型的说明符不能混合使用
signed short int num1 = 666;
signed unsigned int num2 = 666;