C数据类型

基本类型

基本类型是C语言内置的类型。

整型

整形类型可以表示一个整数。

类型 简写 说明 占用字节
char char 字符型 1
int int 整型 4
short int short 短整型 2
long int long 长整形 4

整型字面量

字面量是源代码中固定的表示方法。

整数字面量可以是10进制,16进制,8进制。

使用0x,0X前缀的数字,用16进制数。16进制可以使用0~9a~fA~F。 使用0前缀的数字,是8进制数。8进制可以使用0~7。 没有前缀是10进制数。10进制可以使用0~9

使用u,U后缀的数,是无符号类型。 使用l,L后缀的数,是长整型。

数字前可以加-,表示负数。

int i = 100;//10进制
int j = 0xff;//16进制
int k = 010;//8进制
//int m = 088;//编译错误,8进制只能用0~7

字符型字面量

字符字面量使用单引号'包围一个字符。字符类型保存的是字符的ascii码。

char ch = 'a';//97

对于一些不可见字符,可以使用反斜杠\开始转义字符来表示。

字符 说明
\n 换行
\t 制表符
\r 回车
\\ 反斜杠自身
\' 单引号自身
\012 8进制表示的字符
\0x12 16进制表示的字符

整型在计算机内部的表示

整型数字在计算机内部使用二进制表示。以下以short类型来说明。

无符号类型整数使用数字的二进制原码表示:

100表示成0000 0000 0110 0100

无符号类型的范围:0 ~ 2^n-1,其中n表示位数,short占用2个字节,是16位。

有符号类型整数正数使用二进制原码表示,负数使用补码表示。补码是负数相反数的二进制源码取反+1。

-100 相反数是 100 100 的二进制是 0000 0000 0110 0100 0000 0000 0110 0100 的补码是 1111 1111 1001 1011 +1 是 1111 1111 1001 1100

因此,-100的二进制表示是 1111 1111 1001 1100

有符号整数类型的范围是 -2^(n-1) ~ 2^(n-1)-1。

负数之所以使用补码,是为了便于判断和计算。

浮点数

浮点数可以表示小数。

类型 说明 占用空间
float 单精度浮点数 4字节
double 双精度浮点数 8字节

浮点数表示的数字并不精确。

浮点数字面量

浮点数字面量可以使用小数形式和指数形式。

小数形式使用小数点整数部分.小数部分。如果整数部分为0,可以忽略。

指数形式是数字部分e指数指数,其中数字部分是小数,指数部分是整数。

    float i = 3.14;//小数形式
    float j = .14;//省略整数部分的0
    float k = 1.5e10;//指数形式
    float m = .5e20;//指数形式,数字部分的小数忽略整数部分的0

浮点数的内部表示形式

浮点数在内部使用二进制的方式表示,其中包含数字部分,指数部分和符号部分。

32位浮点数包含1位符号,8位指数,23位数字。

64位浮点数包含1位符号,11位指数,52位数字。

逻辑类型

C语言没有单独的逻辑类型,可以使用整数、指针等作为逻辑类型。

在需要逻辑类型时,非0为真,0为假。

在关系运算符、逻辑运算符等返回逻辑类型时,真为1,假为0。

指针类型

指针类型存储另一个变量的地址。

数组

数组可以在一个连续空间定义一组相同类型变量。

结构体

结构体是多个类型组成的复合类型。

类型别名

使用typedef可以为类型定义别名。

定义别名之后,可以像使用已有类型一样通过别名定义变量。 别名没有创建新类型。

语法:

typedef type alias;
typedef int int32;
typedef char byte;
typedef void* pvoid;

struct tag_point
{
    int x;
    int y;
};

typedef struct tag_point point;

typedef void (*cb)();

byte b = 100;