前言👦
本章结内容将结合3本C语言书籍进行总结归纳,讲述数据的基本类型,数据类型的使用、范围,在何时该使用哪个数据类型较为合适。
C语言 | 快速了解C的发展史🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 指针、数组 一文透彻~~~🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 结构体、联合、枚举🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 声明🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 作用域 在也不用担心分不清变量的作用域拉!!!🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 编译步骤 会用C还不知道C如何编译???🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 数据类型总结🧡💛💚💙
C语言 | 【耗费一夜总结三本C语言系列】之 位及进制的用法🧡💛💚💙
文章目录
一、C的数据类型有哪些?是什么?🥴
C语言有且仅有4中数据类型:
- 整型;
- 浮点型;
- 指针;
- 聚合类型;
- 其他类型:都由以上四种类型的衍生出来的。
1.1 数据类型关键字
int
、long
、short
、char
、float
、double
、unsigned
、signed
(C90)、void
(C90)、_Bool
(C99)、_Complex
(C99)、_Imaginary
(C99);
查看大小
#include<stdio.h>
#include<stdlib.h>
int main(){
printf("int:%d bytes\n", sizeof(int));
printf("char:%d byte\n", sizeof(char)); /* char型的字节数为1 */
printf("short:%d bytes\n", sizeof(short)); /* short型的字节数为2 */
printf("long:%d bytes\n", sizeof(long)); /* long型的字节数为4 */
printf("float:%d bytes\n", sizeof(float)); /* float型的字节数为4 */
printf("double:%d bytes\n", sizeof(double)); /* double型的字节数为8 */
printf("long double:%d bytes\n", sizeof(long double)); /* long double型的字节数为8或10或12 */
system("pause");
return 0;
}
那么我们就按照以上的类型展开…【注:指针和聚合这个俩个的内容较多,后续会单独总结一篇】
二、数据类型介绍😲
1.1 整型数据类型
整型包括
字符、短整型、整型、长整型
。【有些同学可能会感到疑惑为何字符属于整型类型呢???】因为计算机使用的是数字编码。常用的是ASCII编码,使用特殊的整数
表示特定的字符
。在例如后续会学到的文件读取函数读取到的都是字符,返回的基本都为int类型,以EOF(-1)为标志。
1.1.1 int类型
使用
使用前必须声明;
int i;
int k,j;
int m=10;
查看整型大小
- int型长度不仅与具体的
CPU架构
有关,而且与编译器
有关。- int型长度的确定有三个准则:
- ① C/C++规定
int字长
和机器字长
相同;- ② 操作
系统字长
和机器字长
未必一致;(前者小于等于后者)- ③ 编译器根据操作
系统字长
来定义int字长
;
#include<stdlib.h>
#include<stdio.h>
#include<limits.h>
int main(){
printf("最小(有符号)整型:%d\n", INT_MIN);
printf("最大(有符号)整型:%d\n", INT_MAX);
printf("最大(无符号)整型:%d\n", UINT_MAX);
system("pause");
}
了解字是什么
- 字是设计计算机时给定的
自然存储单元
;- 它与
位、字节
是描述计算机数据单元或存储单元的术语;- 1字长只有8位,直至今日出现了64位;
- 该
字长越长
,则计算机数据传输越快
,允许访问的内存越多。
1.1.2 short类型
占用的存储空间可能比int类型少,适用于较小数值的场合以节省空间;
查看短整型大小
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int main(){
printf("最小(有符号)短值:%d\n", SHRT_MIN);
printf("最大(有符号)短值:%d\n", SHRT_MAX);
printf("最大(无符号)短值:%d\n", USHRT_MAX);
system("pause");
}
1.1.3 long类型
占用的存储空间可能比int多,适用于较大的数值场合;
查看长整型大小
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
int main(){
// 长整型
printf("--------------------------------------------\n");
printf("最小(有符号)长整型:%d\n", LONG_MIN);
printf("最大(有符号)长整型:%d\n", LONG_MAX);
printf("最大(无符号)长整型:%d\n", ULONG_MAX);
// 长长整型
printf("--------------------------------------------\n");
printf("最小(有符号)长长整型:%d\n", LLONG_MIN);
printf("最大(有符号)长长整型:%d\n", LLONG_MAX);
printf("最大(无符号)长长整型:%d\n", ULLONG_MAX);
system("pause");
}
有了long类型为何还有longlong类型呢?
由于目前计算机普遍是
64位处理器
,为了存储64位整数,才将此引入;
较为常见的:long long(64位)
、long(32位)
、short(16位)
、int(16位/32位)
;
11.4 signed与unsigned关键字
signed:[可选] 可在任何有符号的关键字前添加声明,起
强调作用
,包括负数。
unsigned:[必] 若要表示无符号则需要关键字前添加,只有0和正数;
1.1.5 char类型
- 为了容纳字符串型值,存储字母或标点符号;
- 存储在8位的存储单元。
#include<stdio.h>
#include<stdlib.h>
int main(){
char a = 'AXDF'; // 存储在8位的存储单元
printf("ret: %c\n", a);
system("pause");
}
// 由于存储单元为8位,则只有最后8位单元有效
查看字符型大小
#include<limits.h>
#include<stdio.h>
#include<stdlib.h>
int main(){
printf("一个字符的位数:%d\n", CHAR_BIT);
printf("最小(有符号)字符类型:%d\n", SCHAR_MIN);
printf("最大(有符号)字符类型:%d\n", SCHAR_MAX);
printf("最大(无符号)字符类型:%d\n", UCHAR_MAX);
system("pause");
}
1.1.6 _Bool类型
通常用来进行逻辑判断,即true和false,仅占1位存储空间;
1.1.7 _Complex类型
表示复数:
float_Complex
、double_Complex
、long double_Complex
;
1.1.8 _Imaginary类型
表示虚数:
float_Imaginary
、double_Imaginary
、long double_Imaginary
;
1.1.9 注意事项:
- 不能通过字面意思理解,
长整型必须比短整型长
,在标准中并无规定,但不能比短整型短
;长整型至少应该和整型一样长
,而整型至少应该和短整型一样长
;- 尽量不要在代码中使用无符号类型,即使表示的数据是不存在负值;
- 一般只有在使用位段和二进制掩码时,才可以用无符号数;
1.2 浮点型数据类型
1.2.1 float类型
- 浮点类型,通常是实际值的近似值。如10.0可能存储位9.99999;
- 一般可精确到至少6位有效数字,范围一般在与10-37~10+37;
计数法
- 数字:12.123;
- 科学计数法:1.2x107;
- 指数计数法:1.2e7;
#include<stdio.h>
#include<stdlib.h>
int main(){
float f = 112.231;
printf("%f\n", f);
printf("%e\n", f);
system("pause");
}
查看float范围
#include<stdio.h>
#include<stdlib.h>
#include <float.h>
int main(){
printf("最小float值:%e\n", FLT_MIN);
printf("最大float值:%e\n", FLT_MAX);
system("pause");
return 0;
}
1.2.2 double类型
- 为双精度,占64位,提高了精度;
- 至少能表示10位有效数字;
- 还有long double以适应更高精度的需求;
查看double范围
#include<stdio.h>
#include<stdlib.h>
#include <float.h>
int main(){
printf("最小double值:%e\n", DBL_MIN);
printf("最大double值:%e\n", DBL_MAX);
system("pause");
return 0;
}
三、使用中关乎到可移植性的问题
为了统一在各个系统中某些类型的功能相同。1999年,ANSI推出了C99新增了头文件
stdint.h
和inttypes.h
。
所以,在开发过程中为了避免在移植的过程中出现问题,因尽量使用该俩个头文件来定义变量;
3.1 头文件stdint.h简介
typedef 定义类型 | 无符号类型 | 描述 |
---|---|---|
intmax_t | uintmax_t | 最大宽度的整数类型 |
int8_t | uint8_t | 宽度为8位的整数类型,有符号类型则负值使用 2 的补码表示 |
int16_t | uint16_t | 宽度为16位的整数类型,有符号类型则负值使用 2 的补码表示 |
int32_t | uint32_t | 宽度为32位的整数类型,有符号类型则负值使用 2 的补码表示 |
int64_t | uint64_t | 宽度为64位的整数类型,有符号类型则负值使用 2 的补码表示 |
int_least8_t | uint_least8_t | 最小8位的整数类型 |
int_least16_t | uint_least16_t | 最小16位的整数类型 |
int_least32_t | uint_least32_t | 最小32位的整数类型 |
int_least64_t | uint_least64_t | 最小64位的整数类型 |
int_fast8_t | uint_fast8_t | 最小8位的整数类型 |
int_fast16_t | uint_fast16_t | 最小16位的整数类型 |
int_fast32_t | uint_fast32_t | 最小32位的整数类型 |
int_fast64_t | uint_fast64_t | 最小64位的整数类型 |
intptr_t | uintptr_t | 整数类型,能够保存从void指针转换而来的值,然后将其转换回与原始指针相等的值的类型 |
3.2 可移植代码应遵循以下标准
- 只使用已确定的特性;
- 不突破任何由编译器实现的限制;
- 不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。