C语言中数据类型用于申明变量或函数。类型是对数据分配存储单元的安排,包括存储单元的长度(占有字节)以及数据的存储形式。
C语言中数据类型分为以下几种:
类型 | 描述 |
基本类型 | 属于算术类型,包括整数类型和浮点类型 |
枚举类型(enum) | 属于算术类型,程序中用户定义的整数类型 |
空类型(void) | 表示没有值可用 |
派生类型 | 包括:指针类型、数组类型、结构体类型、共用体类型、函数类型 |
以下是在64位系统下整数类型的详情:
类型 | 存储大小 | 值范围 | 描述 |
(signed) char(有符号字符型) | 1byte | -128~127 | 有符号8位整数 |
unsigned char (无符号字符型) | 1byte | 0~255 | 无符号8位整数 |
(signed)short(有符号短整型) | 2byte | -32768~32767 | 有符号16位整数 |
unsigned short(无符号短整型) | 2byte | 0~65535 | 无符号16位整数 |
(signed)int(有符号基本整形) | 4byte | -2147483648~2147483647 | 有符号32位整数 |
unsigned int(无符号基本整型) | 4byte | 0~4294967295 | 无符号32位整数 |
(signed)long long int(有符号双长整型) | 8byte | -9223372036854775808~9223372036854775807 | 有符号64位整数 |
unsigned long long int (无符号双长整型) | 8byte | 0~18446744073709551615 | 无符号64位整数 |
_Bool(布尔型) | 1byte | 1(true),0(false) | 8位整数 |
在stdint.h和stdbool.h中对精确宽度整数类型及其大小限制有下列定义:
typedef signed char int8_t; typedef unsigned char uint8_t; typedef short int16_t; typedef unsigned short uint16_t; typedef int int32_t; typedef unsigned uint32_t; typedef long long int64_t; typedef unsigned long long uint64_t; typedef bool _Bool typedef true 1 typedef false 0 #define INT8_MIN (-128) #define INT16_MIN (-32768) #define INT32_MIN (-3247483647 - 1) #define INT64_MIN (-9223372036854775807LL - 1) #define INT8_MAX 127 #define INT16_MAX 32767 #define INT32_MAX 2147483647 #define INT64_MAX 9223372036854775807LL #define UINT8_MAX 0xff /*255U*/ #define UINT16_MAX 0xffff /*65535*/ #define UINT32_MAX 0xffffffff /*4294967295U*/ #define UINT64_MAX 0xffffffffffffffff /*18446744073709551615ULL*/
浮点类型详情:
类型 | 字节数 | 取值范围(绝对值) | 有效位数 |
float | 4 | 1.175494e-38~3.402823e+38 | 6 |
double | 8 | 2.225074e-308~1.797693e+308 | 15 |
long double | 16 | 3.362103e-4932~1.189731e+4932 | 18 |
int main(int arg,char* argv[]){ printf("单精度浮点型存储字节大小:%lu\n",sizeof(float)); printf("单精度浮点型取值范围(绝对值):%e~%e\n",FLT_MIN,FLT_MAX); printf("单精度浮点型有效位数:%d\n",FLT_DIG); printf("双精度浮点型存储字节大小:%lu\n",sizeof(double)); printf("双精度浮点型取值范围(绝对值):%e~%e\n",DBL_MIN,DBL_MAX); printf("双精度浮点型有效位数:%d\n",DBL_DIG); printf("长双精度型存储字节大小:%lu\n",sizeof(long double)); printf("长双精度型取值范围(绝对值):%Le~%Le\n",LDBL_MIN,LDBL_MAX); printf("长双精度型有效位数:%d\n",LDBL_DIG); return 0; }运行结果:
单精度浮点型存储字节大小:4 单精度浮点型取值范围(绝对值):1.175494e-38~3.402823e+38 单精度浮点型有效位数:6 双精度浮点型存储字节大小:8 双精度浮点型取值范围(绝对值):2.225074e-308~1.797693e+308 双精度浮点型有效位数:15 长双精度型存储字节大小:16 长双精度型取值范围(绝对值):3.362103e-4932~1.189731e+4932 长双精度型有效位数:18
C99中提供了复数支持,用两个两同的浮点类型分别表示复数的实部和虚部,例:float _Complex = float +float*i.并可以分别通过creal(float _Complex)和cimag(float _Complex)函数获取该复数的实部和虚部。具体定义于头文件complex.h中。
printf("单精度浮点型复数字节大小:%lu\n",sizeof(float _Complex)); printf("双精度浮点型复数字节大小:%lu\n",sizeof(double _Complex)); printf("长双精度型复数字节大小:%lu\n",sizeof(long double _Complex));
单精度浮点型复数字节大小:8 双精度浮点型复数字节大小:16 长双精度型复数字节大小:32
所谓枚举是指将变量的值一一列举出来,变量指限于列举出来的值的范围内取值。
enum Color{ RED, BLUE, BLACK = 5, YELLEW }; enum Color red = RED; printf("red = %d\n",red); enum Color blue = BLUE; printf("blue = %d\n",blue); enum Color black = BLACK; printf("black = %d\n",black); enum Color yellew = YELLEW; printf("yellew = %d\n",yellew);
red = 0 blue = 1 black = 5 yellew = 6
void类型指没有可用值,一般出现于下列三种情况:
类型 | |
函数返回为空 | 不返回值的函数的返回类型为空,例如:void exit() |
函数参数为空 | 不带参数的函数,可以接收一个void,例如:int rand(void) |
指针指向为空 | 类型为void的指针代表对象的地址,而非类型。例如:void malloc(size_t size);返回指向void的指针,可以转换为任何数据类型。 |