程序员求职经验分享与学习资料整理平台

网站首页 > 文章精选 正文

C语言备忘录 - 03. 基本数据类型

balukai 2025-01-05 15:45:24 文章精选 7 ℃

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;
}
最近发表
标签列表