C语言备忘录 - 03. 基本数据类型(c语言的6种基本数据类型)
C 语言中的数据类型可分为如下几种:
- 基本类型:字符类型、整数类型、浮点数类型、布尔类型、枚举类型
- void类型
- 指针类型
- 构造类型:数组、结构体、公用体
这里我们介绍下基本类型,其他几种类型会在后边几个章节中进行讲解。
一、字符类型与整数类型
字符类型或整数类型所占存储空间的字节大小:
类型 | Linux 32 | Linux 64 |
char | 1 | 1 |
short [int] | 2 | 2 |
int | 4 | 4 |
long [int] | 4 | 8 |
long long [int] | 8 | 8 |
字符类型 char 在内存中存储的本质与整数类型是相同的,只是存储大小不同。char 类型可以表示的字符集通常是 ASCII 字符集。
实际上,C语言并没有严格规定 short、int、long 的长度,只做了宽泛的限制:short 的长度不能大于 int,long 的长度不能小于 int。而这些类型的具体大小是由各个操作系统及编译器决定的。
下面我们在代码里实测一下在 linux 64 位系统下,每个类型的具体大小:
#include <stdio.h>
int main()
{
printf("char: %ld\n",
sizeof(char)); // 1
printf("short: %ld\n",
sizeof(short)); // 2
printf("int: %ld\n",
sizeof(int)); // 4
printf("long: %ld\n",
sizeof(long)); // 8
printf("long long: %ld\n",
sizeof(long long)); // 8
return 0;
}
整数类型又分为有符号整数和无符号整数。有符号整数可以表示正数、负数和零,而无符号整数只能表示正数和零,使用 signed 与 unsigned 关键字标识。
整数类型默认是有符号类型,但 char 比较特殊,其默认是 signed 还是 unsigned 由编译器决定。
#include <stdio.h>
#include <limits.h>
int main()
{
/* 有符号或无符号 char */
printf("char Min: %d\n", CHAR_MIN);
printf("char Max: %d\n", CHAR_MAX);
/* 有符号 char */
printf("signed char Min: %d\n", SCHAR_MIN);
printf("signed char Max: %d\n", SCHAR_MAX);
/* 无符号 char */
printf("unsigned char Max: %u\n", UCHAR_MAX);
printf("signed short Min: %d\n", SHRT_MIN);
printf("signed short Max: %d\n", SHRT_MAX);
printf("unsigned short Max: %u\n", USHRT_MAX);
printf("signed int Min: %d\n", INT_MIN);
printf("signed int Max: %d\n", INT_MAX);
printf("unsigned int Max: %u\n", UINT_MAX);
printf("signed long Min: %ld\n", LONG_MIN);
printf("signed long Max: %ld\n", LONG_MAX);
printf("unsigned long Max: %lu\n", ULONG_MAX);
printf("signed long long Min: %lld\n", LLONG_MIN);
printf("signed long long Max: %lld\n", LLONG_MAX);
printf("unsigned long long Max: %llu\n", ULLONG_MAX);
return 0;
}
$ gcc test.c && ./a.out
char Min: -128
char Max: 127
signed char Min: -128
signed char Max: 127
unsigned char Max: 255
signed short Min: -32768
signed short Max: 32767
unsigned short Max: 65535
signed int Min: -2147483648
signed int Max: 2147483647
unsigned int Max: 4294967295
signed long Min: -9223372036854775808
signed long Max: 9223372036854775807
unsigned long Max: 18446744073709551615
signed long long Min: -9223372036854775808
signed long long Max: 9223372036854775807
unsigned long long Max: 18446744073709551615
二、浮点类型
浮点类型所占存储空间的字节大小:
类型 | Linux 32 | Linux 64 |
float | 4 | 4 |
double | 8 | 8 |
long double | 12 | 16 |
下面我们在代码里实测一下在 linux 64 位系统下,浮点类型的具体大小与范围:
#include <stdio.h>
#include <float.h>
int main()
{
printf("float Size: %ld\n", sizeof(float));
printf("float Min: %e\n", FLT_MIN);
printf("float Max: %e\n", FLT_MAX);
printf("double Size: %ld\n", sizeof(double));
printf("double Min: %e\n", DBL_MIN);
printf("double Max: %e\n", DBL_MAX);
printf("long double Size: %ld\n", sizeof(long double));
printf("long double Min: %Le\n", LDBL_MIN);
printf("long double Max: %Le\n", LDBL_MAX);
return 0;
}
$ gcc test.c && ./a.out
float Size: 4
float Min: 1.175494e-38
float Max: 3.402823e+38
double Size: 8
double Min: 2.225074e-308
double Max: 1.797693e+308
long double Size: 16
long double Min: 3.362103e-4932
long double Max: 1.189731e+4932
三、类型转换
C 语言中有两种类型转换:
- 隐式类型转换:隐式类型转换是在表达式中自动发生的,无需进行任何明确的指令或函数调用。它通常是将一种较小的类型自动转换为较大的类型,例如,将 int 转换为 long 或 float 转换为 double 。
- 显式类型转换:显式类型转换需要使用强制类型转换运算符(),它可以将一个数据类型的值强制转换为另一种数据类型的值。强制类型转换可以使程序员在必要时对数据类型进行更精确的控制,但也可能会导致数据丢失或截断。
#include <stdio.h>
int main()
{
/* 隐式类型转换 */
int i = 10;
float f = 3.14;
// 隐式将 int 类型转换为 double 类型
double d = i + f;
printf("d = %f\n", d);
/* 显式类型转换 */
double e = 3.1415926;
// 显式将 double 类型转换为 int 类型
int g = (int) e;
printf("g = %d\n", g);
return 0;
}