C 语言中的变量类型
对于 C 语言的变量类型这里有两种说法:
一种是只包含基础的变量类型,如整数型,浮点型等;另外一种则是在上述类型的基础上还包含了一些用户可以定义的复合的类型,如 array,structure 等等。
我们这里只介绍大家通常意义上所认识的前一种基本的 C 语言数据类型。更为复杂的这些数据组合的结构,我们会在后面单独列出。
1. 变量类型
因为 C 语言与需要编译之后才能执行,所以需要对变量指定类型后才能使用。因为 C 语言会对不同的数据类型分配不同的内存大小,这就是为什么 C 语言需要指定数据类型,而诸如 PHP, Python 这样的语言不需要指定。指定大小的好处是可以让程序处理起来更快,内存的开销更小。
变量类型列表
类型 | 存储长度 | 数值范围 |
---|---|---|
char | 1 byte | -128 to 127 |
unsigned char | 1 byte | 0 to 255 |
signed char | 1 byte | -128 to 127 |
int | 4 bytes | -2,147,483,648 to 2,147,483,647 |
unsigned int | 4 bytes | 0 to 4,294,967,295 |
short | 2 bytes | -32,768 to 32,767 |
unsigned short | 2 bytes | 0 to 65,535 |
long | 8 bytes | -9223372036854775808 to 9223372036854775807 |
unsigned long | 8 bytes | 0 to 18446744073709551615 |
对于用科学计数法表示的类型还涉及到小数可以表示的精度,也就是有效数字。请看下面的表格:
类型 | 存储长度 | 数值范围 | 小数点后的位数 |
---|---|---|---|
float | 4 byte | 1.2E-38 to 3.4E+38 | 6 |
double | 8 byte | 2.3E-308 to 1.7E+308 | 15 |
long double | 10 byte | 3.4E-4932 to 1.1E+4932 | 19 |
这里有一个程序可以输出你的计算机中的不同数据结构在内存中所占用的内存的位数。对于不同的硬件这个返回值是不同的。
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>
int main(int argc, char** argv) {
printf("CHAR_BIT : %d\n", CHAR_BIT);
printf("CHAR_MAX : %d\n", CHAR_MAX);
printf("CHAR_MIN : %d\n", CHAR_MIN);
printf("INT_BIT : %d\n", sizeof(int));
printf("INT_MAX : %d\n", INT_MAX);
printf("INT_MIN : %d\n", INT_MIN);
printf("LONG_BIT : %d\n", sizeof(long));
printf("LONG_MAX : %ld\n", (long) LONG_MAX);
printf("LONG_MIN : %ld\n", (long) LONG_MIN);
printf("SCHAR_BIT : %d\n", sizeof(signed char));
printf("SCHAR_MAX : %d\n", SCHAR_MAX);
printf("SCHAR_MIN : %d\n", SCHAR_MIN);
printf("SHRT_BIT : %d\n", sizeof(short));
printf("SHRT_MAX : %d\n", SHRT_MAX);
printf("SHRT_MIN : %d\n", SHRT_MIN);
printf("UCHAR_BIT : %d\n", sizeof(unsigned char));
printf("UCHAR_MAX : %d\n", UCHAR_MAX);
printf("UINT_MAX : %u\n", (unsigned int) UINT_MAX);
printf("ULONG_BIT : %d\n", sizeof(unsigned long));
printf("ULONG_MAX : %lu\n", (unsigned long) ULONG_MAX);
printf("USHRT_MAX : %d\n", (unsigned short) USHRT_MAX);
printf("Storage size for float : %d \n", sizeof(float));
printf("Strage size for double : %d\n", sizeof(double));
printf("FLT_MAX : %g\n", (float) FLT_MAX);
printf("FLT_MIN : %g\n", (float) FLT_MIN);
printf("-FLT_MAX : %g\n", (float) -FLT_MAX);
printf("-FLT_MIN : %g\n", (float) -FLT_MIN);
printf("DBL_MAX : %g\n", (double) DBL_MAX);
printf("DBL_MIN : %g\n", (double) DBL_MIN);
printf("-DBL_MAX : %g\n", (double) -DBL_MAX);
printf("Float precision value : %d\n", FLT_DIG );
printf("Double precision value : %d\n", DBL_DIG );
return 0;
}
将上面的程序粘贴到文本编辑器中,然后以 test.c 文件名保存。
在终端命令行中输入
gcc test.c -o test
编译完成后
./test
来执行上面的程序。
我的树莓派4上输出的结果如下:
CHAR_BIT : 8
CHAR_MAX : 255
CHAR_MIN : 0
INT_BIT : 4
INT_MAX : 2147483647
INT_MIN : -2147483648
LONG_BIT : 4
LONG_MAX : 2147483647
LONG_MIN : -2147483648
SCHAR_BIT : 1
SCHAR_MAX : 127
SCHAR_MIN : -128
SHRT_BIT : 2
SHRT_MAX : 32767
SHRT_MIN : -32768
UCHAR_BIT : 1
UCHAR_MAX : 255
UINT_MAX : 4294967295
ULONG_BIT : 4
ULONG_MAX : 4294967295
USHRT_MAX : 65535
Storage size for float : 4
Strage size for double : 8
FLT_MAX : 3.40282e+38
FLT_MIN : 1.17549e-38
-FLT_MAX : -3.40282e+38
-FLT_MIN : -1.17549e-38
DBL_MAX : 1.79769e+308
DBL_MIN : 2.22507e-308
-DBL_MAX : -1.79769e+308
Float precision value : 6
Double precision value : 15
这台单板计算机的处理器是 arm64。
在树莓派2上的输出结果如下:
CHAR_BIT : 8
CHAR_MAX : 255
CHAR_MIN : 0
INT_BIT : 4
INT_MAX : 2147483647
INT_MIN : -2147483648
LONG_BIT : 4
LONG_MAX : 2147483647
LONG_MIN : -2147483648
SCHAR_BIT : 1
SCHAR_MAX : 127
SCHAR_MIN : -128
SHRT_BIT : 2
SHRT_MAX : 32767
SHRT_MIN : -32768
UCHAR_BIT : 1
UCHAR_MAX : 255
UINT_MAX : 4294967295
ULONG_BIT : 4
ULONG_MAX : 4294967295
USHRT_MAX : 65535
Storage size for float : 4
Strage size for double : 8
FLT_MAX : 3.40282e+38
FLT_MIN : 1.17549e-38
-FLT_MAX : -3.40282e+38
-FLT_MIN : -1.17549e-38
DBL_MAX : 1.79769e+308
DBL_MIN : 2.22507e-308
-DBL_MAX : -1.79769e+308
Float precision value : 6
Double precision value : 15
这台单板计算机的处理器是 arm32。
在我的笔记本电脑上运行的结果如下:
CHAR_BIT : 8
CHAR_MAX : 127
CHAR_MIN : -128
INT_BIT : 4
INT_MAX : 2147483647
INT_MIN : -2147483648
LONG_BIT : 8
LONG_MAX : 9223372036854775807
LONG_MIN : -9223372036854775808
SCHAR_BIT : 1
SCHAR_MAX : 127
SCHAR_MIN : -128
SHRT_BIT : 2
SHRT_MAX : 32767
SHRT_MIN : -32768
UCHAR_BIT : 1
UCHAR_MAX : 255
UINT_MAX : 4294967295
ULONG_BIT : 8
ULONG_MAX : 18446744073709551615
USHRT_MAX : 65535
Storage size for float : 4
Strage size for double : 8
FLT_MAX : 3.40282e+38
FLT_MIN : 1.17549e-38
-FLT_MAX : -3.40282e+38
-FLT_MIN : -1.17549e-38
DBL_MAX : 1.79769e+308
DBL_MIN : 2.22507e-308
-DBL_MAX : -1.79769e+308
Float precision value : 6
Double precision value : 15
这台电脑的处理器是 x86_64 架构,也就是大家在市场上买到的家用电脑的架构。
大家可以看到这里有些数值是一样的,但是有些却不同。这就是计算机硬件上的差异,大家在使用 C 语言给硬件编程的时候一定要考虑到这点影响。
2. 小结
C 语言作为一种静态语言,在变量使用之前,要确定变量的类型,用来分配在内存中所需要占用的空间。
C 语言的类型包含了有符号型和无符号型两大类。有符号类型可以表示复数。而无符号类型只能表示从 0 开始的数值。
不同的计算机硬件体系结构,使得数值的表示范围会发生变化。对于数值范围敏感的程序,一定要处理好变量类型,防止数值过大造成程序错误。