C数据类型

在 C 语言中,数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间,以及如何解释存储的位模式。

C中的类型:

基本类型:它们是算术类型,包括两种类型:整数类型和浮点类型。
枚举类型:它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。
void 类型:类型说明符 void 表明没有可用的值。
派生类型:它们包括:指针类型、数组类型、结构类型、共用体类型和函数类型。

数组类型和结构类型统称为聚合类型。函数的类型指的是函数返回值的类型。

整数类型

下表列出了关于标准整数类型的存储大小和值范围的细节:

类型 存储大小 值范围
char 1 字节(8bit) -128 到 127 或 0 到 255
unsigned char 1 字节 0 到 255
signed char 1 字节 -128 到 127
int 2 或 4 字节 -32,768 到 32,767 或 -2,147,483,648 到 2,147,483,647
unsigned int 2 或 4 字节 0 到 65,535 或 0 到 4,294,967,295
short 2 字节 -32,768 到 32,767
unsigned short 2 字节 0 到 65,535
long 4 字节 -2,147,483,648 到 2,147,483,647
unsigned long 4 字节 0 到 4,294,967,295

注意,各种类型的存储大小与系统位数有关,目前通用的以64位系统为主。

以下列出了32位系统与64位系统的存储大小的差别(windows 相同):

32-64.jpg

表达式 sizeof(type) 得到对象或类型的存储字节大小。

1
2
3
4
5
6
7
8
9
#include <stdio.h>
#include <limits.h>

int main()
{
printf("int 存储大小 : %lu \n", sizeof(int));

return 0;
}

%lu 为 32 位无符号整数。

当您在 Linux 上编译并执行上面的程序时,它会产生下列结果:

1
int 存储大小 : 4 

浮点类型

类型 存储大小 值范围 精度
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 位小数

浮点数:也称为实型数据或实数。在C语言中,实数只采用十进制。它有二种形式:十进制小数形式和指数形式。

1)十进制数形式

由数码0~ 9和小数点组成。 例如:0.0、25.0、5.789、0.13、5.0、300.、-267.8230 等均为合法的实数。

注意,必须有小数点。

2) 指数形式

由十进制数,加阶码标志 e 或 E 以及阶码(只能为整数,可以带符号)组成。其一般形式为:
a E n(a为十进制数,n为十进制整数)其值为 a*10n。

1
2
3
4
2.1E5 (等于2.1*105)
3.7E-2 (等于3.7*10-2)
0.5E7 (等于0.5*107)
-2.8E-2 (等于-2.8*10-2)

以下不是合法的浮点数:

1
2
3
4
5
345 (无小数点)
E7 (阶码标志E之前无数字)
-5 (无阶码标志)
53.-E3 (负号位置不对)
2.7E (无阶码)

float:单精度浮点值。单精度是:1位符号,8位指数,23位小数。

v2-749cc641eb4d5dafd085e8c23f8826aa_hd.png

double:双精度浮点值。双精度是:1位符号,11位指数,52位小数。

v2-48240f0e1e0dd33ec89100cbe2d30707_hd.png

头文件 float.h 定义了宏,在程序中可以使用这些值和其他有关实数二进制表示的细节。

实例将输出浮点类型占用的存储空间以及它的范围值:

1
2
3
4
5
6
7
8
9
10
11
12
#include <stdio.h>
#include <float.h>

int main()
{
printf("float 存储最大字节数 : %lu \n", sizeof(float));
printf("float 最小值: %E\n", FLT_MIN );
printf("float 最大值: %E\n", FLT_MAX );
printf("精度值: %d\n", FLT_DIG );

return 0;
}

%E 为以指数形式输出单、双精度实数。

输出:

1
2
3
4
float 存储最大字节数 : 4 
float 最小值: 1.175494E-38
float 最大值: 3.402823E+38
精度值: 6

void 类型

  • 函数返回为空 :C 中有各种函数都不返回值,或者返回空。不返回值的函数的返回类型为空。例如 void exit (int status);
  • 函数参数为空:C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void);
  • 指针指向 void:类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc(size_t size); 返回指向 void 的指针,可以转换为任何数据类型。

数据类型转换

  • 1,数据类型转换:C 语言中如果一个表达式中含有不同类型的常量和变量,在计算时,会将它们自动转换为同一种类型;在 C 语言中也可以对数据类型进行强制转换;
  • 2、自动转换规则:
    a)浮点数赋给整型,该浮点数小数被舍去;
    b)整数赋给浮点型,数值不变,但是被存储到相应的浮点型变量中;
  • 3、强制类型转换形式: (类型说明符)(表达式)

实例程序:

1
2
3
4
5
6
7
8
9
10
11
#include<stdio.h>

int main()
{
float f,x=3.6,y=5.2;
int i=4,a,b;
a=x+y;
b=(int)(x+y);
f=10/i;
printf("a=%d,b=%d,f=%f,x=%f\n",a,b,f,x);
}

例中先计算 x+y 值为 8.8,然后赋值给 a,因为a为整型,所以自取整数部分8,a=8;
接下来 b 把 x+y 强制转换为整型;

最后 10/i 是两个整数相除,结果仍为整数 2,把 2 赋给浮点数 f;
x 为浮点型直接输出。