类型与描述 | |
---|---|
1 | 基本数据类型 它们是算术类型,包括整型(int)、字符型(char)、浮点型(float)和双精度浮点型(double)。 |
2 | 枚举类型: 它们也是算术类型,被用来定义在程序中只能赋予其一定的离散整数值的变量。 |
3 | void 类型: 类型说明符 void 表示没有值的数据类型,通常用于函数返回值。 |
4 | 派生类型: :包括数组类型、指针类型和结构体类型。 |
下表列出了关于标准整数类型的存储大小和值范围的细节:
类型 | 存储大小 | 值范围 |
---|---|---|
char | 1 字节 | -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位系统为主。
————表达式 sizeof(type) 得到对象或类型的存储字节大小————
格式化时用 %lu
#include <stdio.h> #include <limits.h> int main() { ? printf("int 存储大小 : %lu \n", sizeof(int)); ? ? return 0; }
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
类型 | 存储大小 | 值范围 | 精度 |
---|---|---|---|
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 位有效位 |
下面的实例将输出浮点类型占用的存储空间以及它的范围值:
%E 格式化。
#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; }
void 类型指定没有可用的值。它通常用于以下三种情况下:
序号 | 类型与描述 |
---|---|
1 | 函数返回为空 C 中有各种函数都不返回值,或者您可以说它们返回空。不返回值的函数的返回类型为空。例如 void exit (int status); |
2 | 函数参数为空 C 中有各种函数不接受任何参数。不带参数的函数可以接受一个 void。例如 int rand(void); |
3 | 指针指向 void 类型为 void * 的指针代表对象的地址,而不是类型。例如,内存分配函数 void *malloc( size_t size ); 返回指向 void 的指针,可以转换为任何数据类型。 |
类型转换是将一个数据类型的值转换为另一种数据类型的值。
C 语言中有两种类型转换:
隐式类型转换:隐式类型转换是在表达式中自动发生的,无需进行任何明确的指令或函数调用。它通常是将一种较小的类型自动转换为较大的类型,例如,将int类型转换为long类型或float类型转换为double类型。隐式类型转换也可能会导致数据精度丢失或数据截断。
显式类型转换:显式类型转换需要使用强制类型转换运算符(type casting operator),它可以将一个数据类型的值强制转换为另一种数据类型的值。强制类型转换可以使程序员在必要时对数据类型进行更精确的控制,但也可能会导致数据丢失或截断。
int i = 10; float f = 3.14; double d = i + f; *// 隐式将int类型转换为double类型*
double d = 3.14159; int i = (int)d; *// 显式将double类型转换为int类型*
从上面看的,当位数很大时,C语言中int,long等类型不能满足需要,所以我们可以用数组去储存很多的数字。由此而生:
#include<stdio.h>
#include<string.h>
#define maxid 1000 //给常量定义一个别名。
//定义一个函数,返回最大值。
int max(int x, int y) //max函数里面要传 两个参数。
{
int m;
if (x > y)
{
m = x;
}
else
{
m = y;
}
return m;//返回x,y中的最大值。
}
int main()
{
char a[maxid + 1], b[maxid + 1];//用 字符数组 去接收整数数据。
int num1[maxid + 1], num2[maxid + 1];
int len1, len2;
int i, j;//循环时用到...
memset(a, 0, sizeof(a));//把数组a的所有字节都赋值为0(初始化数组)。
memset(b, 0, sizeof(b));
memset(num1, 0, sizeof(num1));
memset(num2, 0, sizeof(num2));
scanf("%s", &a);//分别输入————字符串a,b,后面进行相加操作——————————
scanf("%s", &b);
len1 = strlen(a);//接收字符串a的长度。
len2 = strlen(b);
//将字符串倒着写入整数数组中。(倒序写入)
j = 0;
for (i = len1 - 1; i >= 0; i--)//a字符串倒序写入了数组num1
{
num1[j] = a[i] - '0';
j++;
}
j = 0;
for (i = len2 - 1; i >= 0; i--)//b字符串倒序写入了数组num2
{
num2[j] = b[i] - '0';
j++;
}
//对应的位数进行相加。
for (i = 0; i <= max(len1 - 1, len2 - 1); i++)
{
num1[i] += num2[i];//对应的位数进行相加。
//每次相加时判断值是否大于10,如果大于则进位。
for (j = i; j <= max(len1 - 1, len2 - 1); j++)
{
if (num1[j] >= 10) //大于10就进位——操作:
{
num1[j + 1]++;//相加的位数的前一位进1
num1[j] -= 10;//相加的位数的值减10
}
}
}
//做条件判断
//因为是倒序写入的,所以在for循环输出的时候要再倒序输出。
if (num1[max(len1 - 1, len2 - 1) + 1] == 0)//如果n位整数最高位为0, 则输出n-1位。 例如 01234,其正确结果为1234
{
for (i = max(len1 - 1, len2 - 1); i >= 0; i--)
{
printf("%d", num1[i]);
}
}
if (num1[max(len1 - 1, len2 - 1) + 1] != 0)//如果n位整数最高位不为0, 则输出n位
{
for (i = max(len1 - 1, len2 - 1) + 1; i >= 0; i--)//循环初始语句,这里与上面相比加了1
{
printf("%d", num1[i]);
}
}
return 0;
}