0%

C 数据类型

数据类型

类型 描述
基本类型 它们是算术类型,包括两种类型:整数类型和浮点类型
枚举类型 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量
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 相同):

32-64.jpg

为了得到某个类型或某个变量在特定平台上的准确大小,您可以使用 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
2
3
4
5
6
7
double <- float

long

unsigned

int <- char,short

结合上面的数据不难看出,数据的自动转换是按照所占存储大小来排序的

如果一个 int 和 double 做运算,由于 double 所占的空间比 int 大,所以 int 会被隐式转换为 double, 以此类推

横向向左的箭头表示即使类型相同也必定转换类型
纵向的箭头表示当运算对象为不同类型的数据时转换的方向,并不表示转换过程

例: 两个 float 类型的数据做运算时,会被先转换为 double

显式转换(强制转换)

欢迎关注我的其它发布渠道