数据类型
类型 | 描述 |
---|---|
基本类型 | 它们是算术类型,包括两种类型:整数类型和浮点类型 |
枚举类型 | 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量 |
void 类型 | 类型说明符 void 表明没有可用的值 |
派生类型 | 它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型 |
整数类型
下表列出了关于标准整数类型的存储大小和值范围的细节:
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节(8bit) | 0 ~ 255 即 0 ~ $2^{8}$-1 |
signed char | 1 字节(8bit) | -128 ~ 127 即 -$2^{7}$ ~ $2^{7}$-1 |
unsigned char | 1 字节(8bit) | 0 ~ 255 即 0 ~ $2^{8}$-1 |
int | 4 字节(32bit) | -2147483648 ~ 2147483647 即 -$2^{31}$ ~ $2^{31}$-1 |
unsigned int | 4 字节(32bit) | 0 ~ 4294967295 即 0 ~ $2^{32}$-1 |
short | 2 字节(16bit) | -32768 ~ 32767 即 -$2^{15}$-1 ~ $2^{15}$-1 |
unsigned short | 2 字节(16bit) | 0 ~ 65535 即 0 ~ $2^{16}$- |
long | 4 字节(32bit) | -2147483648 ~ 2147483647 即 -$2^{31}$-1 ~ $2^{31}$-1 |
unsigned long | 4 字节(32bit) | 0 ~ 4294967295 即 0 ~ $2^{32}$-1 |
unsigned(无符号)
一个 int 占 4b 也就是 32bit, 按这么说最大的数就是 32 个 1, 那负数呢?
所以,在 int 中用来储存数据的只用 31 位,第一就是表示正负的,1 表示负数,0 表示正数
但是在 unsigned 中不存负数,所以 unsigned 中的 32 位都是用来存储数据的
注意,各种类型的存储大小与系统位数有关,但目前通用的以 64 位系统为主
以下列出了 32 位系统与 64 位系统的存储大小的差别(windows 相同):
为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 sizeof 运算符
1 | printf("int 存储大小 : %lu \n", sizeof(int)); // %lu 为 32 位无符号整数 |
浮点类型
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
float | 4 字节 | 1.2E-38 ~ 3.4E+38 | 6 位有效位 |
double | 8 字节 | 2.3E-308 ~ 1.7E+308 | 15 位有效位 |
long double | 16 字节 | 3.4E-4932 ~ 1.1E+4932 | 19 位有效位 |
void 类型
类型 | 描述 |
---|---|
函数返回为空 | C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); |
函数参数为空 | C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); |
指针指向 void | 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型 |
类型间的转换
隐式转换(自动转换)
1 | double <- float |
结合上面的数据不难看出,数据的自动转换是按照所占存储大小来排序的
如果一个 int 和 double 做运算,由于 double 所占的空间比 int 大,所以 int 会被隐式转换为 double, 以此类推
横向向左的箭头表示即使类型相同也必定转换类型
纵向的箭头表示当运算对象为不同类型的数据时转换的方向,并不表示转换过程
例: 两个 float 类型的数据做运算时,会被先转换为 double