Cprogramming 简明教程

C - Data Types

C 中的 _ Data types _ 引用了用于声明不同类型 _ variables _ 或 _ functions _ 的一个广泛系统。变量的类型决定了它在存储中占据多少空间,以及如何解释存储的位模式。在本章中,我们将了解 _ data types in C _。一个相关概念是“变量”,它指的是处理器内存中的可寻址位置。通过不同的输入设备获取的数据存储在计算机内存中。一个符号名称可以分配给称为变量名的存储位置。

C 是一种静态类型语言。变量的名称及其打算存储的数据类型必须在实际使用之前明确声明。

C 也是强类型语言,这意味着不允许将一种数据类型自动或隐式转换为另一种数据类型。

C 中的数据类型可以分类如下:

Sr.No.

Types & Description

1

Basic Types 它们是算术类型,进一步分类为:(a) 整数类型和 (b) 浮点类型。

2

Enumerated types 它们再次是算术类型,用于定义可在整个程序中仅分配某些离散整数值的变量。

3

The type void 类型说明符 void 指示没有可用值。

4

Derived types 包括 (a) 指针类型、(b) 数组类型、(c) 结构类型、(d) 联合类型和 (e) 函数类型。

数组类型和结构类型统称为聚合类型。函数的类型指定了函数返回值的类型。我们将在下一部分中看到基本类型,而其他类型将在即将到来的章节中进行介绍。

Integer Data Types in C

下表提供了标准整数类型及其存储大小和值范围的详细信息:

Type

Storage size

Value range

char

1 byte

-128 到 127 或 0 到 255

unsigned char

1 byte

0 to 255

signed char

1 byte

-128 to 127

int

2 or 4 bytes

-32768 到 32767 或 -2147483648 到 2147483647

unsigned int

2 or 4 bytes

0 到 65535 或 0 到 4294967295

short

2 bytes

-32,768 to 32,767

unsigned short

2 bytes

0 to 65,535

long

8 bytes

-9223372036854775808 to 9223372036854775807

unsigned long

8 bytes

0 to 18446744073709551615

要获取特定平台上类型或变量的确切大小,可以使用 sizeof 运算符。表达式 sizeof(type) 会生成对象或类型的存储大小(以字节为单位)。

Example of Integer Data Types

下面是使用 limits.h 头文件中定义的不同常数在机器上获取各种类型大小的示例:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("CHAR_BIT    :   %d\n", CHAR_BIT);
   printf("CHAR_MAX    :   %d\n", CHAR_MAX);
   printf("CHAR_MIN    :   %d\n", CHAR_MIN);
   printf("INT_MAX     :   %d\n", INT_MAX);
   printf("INT_MIN     :   %d\n", INT_MIN);
   printf("LONG_MAX    :   %ld\n", (long) LONG_MAX);
   printf("LONG_MIN    :   %ld\n", (long) LONG_MIN);
   printf("SCHAR_MAX   :   %d\n", SCHAR_MAX);
   printf("SCHAR_MIN   :   %d\n", SCHAR_MIN);
   printf("SHRT_MAX    :   %d\n", SHRT_MAX);
   printf("SHRT_MIN    :   %d\n", SHRT_MIN);
   printf("UCHAR_MAX   :   %d\n", UCHAR_MAX);
   printf("UINT_MAX    :   %u\n", (unsigned int) UINT_MAX);
   printf("ULONG_MAX   :   %lu\n", (unsigned long) ULONG_MAX);
   printf("USHRT_MAX   :   %d\n", (unsigned short) USHRT_MAX);

   return 0;
}

当您编译并执行上述程序时,它会针对 Linux 生成以下结果:

CHAR_BIT    :   8
CHAR_MAX    :   127
CHAR_MIN    :   -128
INT_MAX     :   2147483647
INT_MIN     :   -2147483648
LONG_MAX    :   9223372036854775807
LONG_MIN    :   -9223372036854775808
SCHAR_MAX   :   127
SCHAR_MIN   :   -128
SHRT_MAX    :   32767
SHRT_MIN    :   -32768
UCHAR_MAX   :   255
UINT_MAX    :   4294967295
ULONG_MAX   :   18446744073709551615
USHRT_MAX   :   65535

Floating-Point Data Types in C

下表提供了标准浮点类型及其存储大小、值范围和精度的详细信息:

Type

Storage size

Value range

Precision

float

4 byte

1.2E-38 to 3.4E+38

6 decimal places

double

8 byte

2.3E-308 to 1.7E+308

15 decimal places

long double

10 byte

3.4E-4932 to 1.1E+4932

19 decimal places

头文件 "float.h" 定义了允许您在程序中使用这些值和其他有关实数二进制表示形式的详细信息的宏。

Example Floating-Point Data Types

以下示例打印了浮点类型占用的存储空间及其范围值:

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <float.h>

int main(int argc, char** argv) {

   printf("Storage size for float : %zu \n", sizeof(float));
   printf("FLT_MAX     :   %g\n", (float) FLT_MAX);
   printf("FLT_MIN     :   %g\n", (float) FLT_MIN);
   printf("-FLT_MAX    :   %g\n", (float) -FLT_MAX);
   printf("-FLT_MIN    :   %g\n", (float) -FLT_MIN);
   printf("DBL_MAX     :   %g\n", (double) DBL_MAX);
   printf("DBL_MIN     :   %g\n", (double) DBL_MIN);
   printf("-DBL_MAX     :  %g\n", (double) -DBL_MAX);
   printf("Precision value: %d\n", FLT_DIG );

   return 0;
}

当您编译并执行上述程序时,它会针对 Linux 生成以下结果:

Storage size for float : 4
FLT_MAX      :   3.40282e+38
FLT_MIN      :   1.17549e-38
-FLT_MAX     :   -3.40282e+38
-FLT_MIN     :   -1.17549e-38
DBL_MAX      :   1.79769e+308
DBL_MIN      :   2.22507e-308
-DBL_MAX     :  -1.79769e+308
Precision value: 6

Note: "sizeof" 返回 "size_t"。无符号整数 "size_t" 的类型可能会因平台而异。并且,它可能并非无处不在的长无符号整数。在这种情况下,我们为格式字符串使用 "%zu" 而不是 "%d"。

早期版本的 C 语言中没有布尔型数据。C99 对 ANSI C 的标准化中引入了 _bool 类型,其中零值被视为假,非零值被视为真。

User-defined Data Types in C

有两种由用户定义的数据类型 structunion ,它们由用户使用其他基本数据类型的组合进行定义。

Struct Data Type

一个独特之处 features of C language 是将不同数据类型的值存储在一个变量中。关键字 structunion 用于派生用户定义的数据类型。例如:

struct student   {
   char name[20];
   int marks, age;
};

Union Data Type

联合是结构的特例,其中联合变量的大小不是各个元素大小的总和,如结构中一样,而是对应于各个元素中最大的大小。因此,一次只能使用其中一个元素。请看以下示例:

union ab  {
   int a;
   float b;
};

我们将在后面的章节中了解有关结构和联合类型的更多信息。

The void Data Type in C

void 类型指定不可用任何值。它用于以下三种情况:

Sr.No

Types & Description

1

Function returns as void C 中有各种不返回值或可以说是返回返回值 void 的函数。没有返回值的函数的返回类型为 void 。例如, void exit (int status);

2

Function arguments as void C 中有各种不接受任何参数的函数。没有参数的函数可以接受 void。例如, int rand(void);

3

Pointers to void void * 类型的指针表示对象地址,但不表示其类型。例如,内存分配函数 void *malloc( size_t size ); 会返回指向 void 的指针,可以将其强制转换为任何数据类型。

Arrays Data Type in C

数组是存储在连续内存位置中具有同一数据类型的多个值的集合。数组的大小用方括号 [] 表示。例如,

int marks[5];

可以在声明时对数组进行初始化。要分配的值括在括号中。

int marks[ ]={50,56,76,67,43};

C 还支持多维数组。要了解有关数组的更多信息,请参阅关于 Arrays in C 的章节。

Pointers Data Type in C

指针是特殊变量,用于存储内存中另一个变量/对象的地址或引用。指针变量的名称前缀为星号 (*)。指针变量的类型和要指向的变量/对象必须相同。

int x;
int *y;
y = &x;

在此处,“y”是存储变量“x”地址的指针变量,“x”为“int”类型。

指针用于许多不同的目的。文本字符串操作和动态内存分配是某些必须使用指针的过程。在本章教程后面,你可以找到关于 Pointers in C 的详细章节。