程序总是离不开数据,然而数据需要保存在变量中,所以我们就来讲下变量吧!
(1)简单认识常用数据类型
char、short、int、long、long long、float、double、long double
整数类型:
无符号型:
字节 | 类型 | 值的范围 | |
unsigned char | 1 | 无符号字符型 | 0 ~ 255 |
unsigned short | 2 | 无符号短整型 | 0 ~ 65535 |
unsigned int | 2 / 4 | 无符号整形 | 0 ~ 65535 / 0 ~ 4294967295 |
unsigned long | 4 | 无符号长整型 | 0 ~ 4294967295 |
unsigned long long | 8 | 无符号64位整型 | 0 ~ 18446744073709551615 |
有符号型:
PS:如果没有显式声明unsigned默认是signed的,char标准默认是(unsigned)
字节 | 类型 | 值的范围 | |
signed char | 1 | 无符号字符型 | -127 ~ 127 |
signed short | 2 | 无符号短整型 | -32767 ~ 32767 |
signed int | 2 / 4 | 无符号整形 | -32767 ~ 32767 / -2147483647 ~ 2147483647 |
signed long | 4 | 无符号长整型 | -2147483647 ~ 2147483647 |
signed long long | 8 | 无符号64位整型 | -9223372036854775807 ~ 9223372036854775808 |
浮点数类型:
PS:浮点数没有有符号型和无符号型之分
字节 | 类型 | 值的范围 | |
float | 4 | 单精度浮点型 | 1.175494E-38 ~ 3.402823E+38 |
double | 8 | 双精度浮点型 | 2.225074E-308 ~ 1.797693E+308 |
long double | 8 / 12 | 多精度浮点型 | 2.225074E-308 ~ 1.797693E+308(VS2017与double相同大小) |
(2)数据类型的使用和选择
char(字符型)
PS:char用于储存字符(比如:英文字母和标点符号),但是从技术层面看char是整数类型。因为char实际上储存的是整数而不是字符。
选择:当需要储存英文字母或者标点符号首选char(字符型)
Q:当然你们会问如何储存一段很长的字符串呢?
A:在知道长度的情况下可以使用字符型数组,如果是不定的长度可以使用字符型指针来保存。(超纲了指针是后面的内容)
使用:
PS:为了更清楚看到结果使用了printf进行输出内容
通过 = 直接赋值给变量,变量就会储存所赋的值
#include <stdio.h>
int main(void)
{
char c = 'A';
printf("ASCII:%c \n", c); //A
printf("VALUE:%d\n", c); //65
return 0;
}
字符型 0 ~ 127 分别用来表示 ASCII码表的内容
因为'A'在ASCII码表中十进制是65,所以%d(格式化输出十进制整数),最终输出是65
short(短整型)
选择:当你需要储存的类型是整型,并且储存的值不超过short的值的范围的情况下尽量使用short(短整型),
因为short可比(int、long)节省内存。
PS:int(整型)的字节长度会根据机器而发生改变,int可被定为16位或32位,而short不超过16位
使用:
#include <stdio.h>
#include <limits.h>//用于检测整型数据的数据类型的表达值范围
int main(void)
{
signed short sMax = SHRT_MAX; //有符号短整型最大值
signed short sMin = SHRT_MIN; //有符号短整型最小值
unsigned short uMax = USHRT_MAX; //无符号短整型最大值
unsigned short uMin = 0; //无符号短整型最小值
printf("signed short max:%hd\n", sMax); //32767
printf("signed short min:%hd\n", sMin); //-32768
printf("unsigned short max:%hu\n", uMax); //65535
printf("unsigned short min:%hu\n", uMin); //0
return 0;
}
SHRT_MAX 有符号短整型的最大值
SHRT_MIN 有符号短整型的最小值
USHRT_MAX 无符号短整型的最大值
SHRT_MAX、SHRT_MIN、USHRT_MAX是limits.h头文件定义
%hd(格式化输出有符号短整数)
%hu(格式化输出无符号短整数)
int(整型)
选择:当你需要储存的数值为整型,并且储存的数值大于short而小于long的时候,尽量使用int(整型)
PS:
旧DOS系统的PC提供16位的short和int,以及32位的long
Windows95系统提供16位的short和32位的int和long
使用:
#include <stdio.h>
#include <limits.h>//用于检测整型数据的数据类型的表达值范围
int main(void)
{
signed int nMax = INT_MAX; //有符号整型最大值
signed int nMin = INT_MIN; //有符号整型最小值
unsigned int uMax = UINT_MAX; //无符号整型最大值
unsigned int uMin = 0; //无符号整型最小值
printf("signed int max:%d\n", nMax); //2147483647
printf("signed int min:%d\n", nMin); //-2147483648
printf("unsigned int max:%u\n", uMax); //4294967295
printf("unsigned int min:%u\n", uMin); //0
return 0;
}
INT_MAX 有符号整型的最大值
INT_MIN 有符号整型的最小值
UINT_MAX 无符号整型的最大值
INT_MAX、INT_MIN、UINT_MAX是limits.h头文件定义
%d(格式化输出有符号整数)
%u(格式化输出无符号整数)
long(长整型)
选择:当需要储存的数值为整型,并且储存的数值比int(整型)大的数值比long long小的数值,尽量使用long
使用:
#include <stdio.h>
#include <limits.h>//用于检测整型数据的数据类型的表达值范围
int main(void)
{
signed long lMax = LONG_MAX; //有符号长整型最大值
signed long lMin = LONG_MIN; //有符号长整型最小值
unsigned long ulMax = ULONG_MAX; //无符号长整型最大值
unsigned long ulMin = 0; //无符号长整型最小值
printf("signed long max:%ld\n", lMax); //2147483647
printf("signed long min:%ld\n", lMin); //-2147483647
printf("unsigned long max:%lu\n", ulMax); //4294967295
printf("unsigned long min:%lu\n", ulMin); //0
return 0;
}
LONG_MAX 有符号长整型的最大值
LONG_MIN 有符号长整型的最小值
ULONG_MAX 无符号长整型的最大值
LONG_MAX、LONG_MIN、ULONG_MAX是limits.h头文件定义
%ld(格式化输出有符号长整数)
%lu(格式化输出无符号长整数)
long long(64位整型)
选择:当需要储存的数值为整型,并且储存的数值比long(长整型)大的数值使用,long long(64位整型)
PS:long long是由于计算机普遍使用64位处理器,为了存储64位的数据,才增加的,可以储存比long更大的数值
使用:
#include <stdio.h>
#include <limits.h>//用于检测整型数据的数据类型的表达值范围
int main(void)
{
signed long long llMax = LLONG_MAX; //有符号64位整型最大值
signed long long llMin = LLONG_MIN; //有符号64位整型最小值
unsigned long long lluMax = ULLONG_MAX; //无符号64位整型最大值
unsigned long long lluMin = 0; //无符号64位整型最小值
printf("signed long long max:%lld\n", llMax); //9223372036854775807
printf("signed long long min:%lld\n", llMin); //-9223372036854775808
printf("unsigned long long max:%llu\n", lluMax); //18446744073709551615
printf("unsigned long long min:%llu\n", lluMin); //0
return 0;
}
LLONG_MAX 有符号长整型的最大值
LLONG_MIN 有符号长整型的最小值
ULLONG_MAX 无符号长整型的最大值
LLONG_MAX、LLONG_MIN、ULLONG_MAX是limits.h头文件定义
%lld(格式化输出有符号长整数)PS:VC格式(%l64d)
%llu(格式化输出无符号长整数)
float(单精度浮点型)
选择:当储存的数据为浮点数据(小数),并且数值比double(双精度浮点型)小的时候,尽量使用float(单精度浮点型)
PS:float(单精度浮点型) 4字节 double(双精度浮点型) 8字节
所以double(双精度浮点型)比float(单精度浮点型)可储存的数据更大,精度更高,然而代价就是double(双精度浮点型)内存占用比float(单精度浮点型)更大
使用:
#include <stdio.h>
#include <float.h>//提供了浮点型的范围和精度的宏
int main(void)
{
float fMax = FLT_MAX; //单精度浮点型最大值
float fMin = FLT_MIN; //单精度浮点型最小值
printf("float max:%f\n", fMax); //3.402823466e+38F
printf("float min:%f\n", fMin); //1.175494351e-38F
return 0;
}
FLT_MAX 单精度浮点型的最大值
FLT_MIN 单精度浮点型的最小值
FLT_MAX、FLT_MIN是float.h头文件定义
%f(格式化输出单精度浮点数)
PS:单精度浮点型和双精度浮点型没有有符号和无符号之分!!!
double(双精度浮点型)
选择:当储存的数据为浮点数据(小数),并且数值比float(单精度浮点型)大的时候,尽量使用double(双精度浮点型)
使用:
#include <stdio.h>
#include <float.h>//提供了浮点型的范围和精度的宏
int main(void)
{
double dMax = DBL_MAX; //双精度浮点型最大值
double dMin = DBL_MIN; //双精度浮点型最小值
printf("double max:%lf\n", dMax); //1.7976931348623158e+308
printf("double min:%lf\n", dMin); //2.2250738585072014e-308
return 0;
}
DBL_MAX 双精度浮点型的最大值
DBL_MIN 双精度浮点型的最小值
DBL_MAX、DBL_MIN是float.h头文件定义
%lf(格式化输出双精度浮点数)
long double(多精度浮点型)
选择:当储存的数据为浮点数据(小数),并且数值比double(双精度浮点型)大的时候,使用long double(多精度浮点型)
PS:
long double(多精度浮点型),不过并没有明确规定long double(多精度浮点型)的精度,根据不同平台会有不同的实现,就像int(整型)和long(长整型),但规定long double(多精度浮点型)的精度不少于double(双精度浮点型)
使用:
#include <stdio.h>
#include <float.h>//提供了浮点型的范围和精度的宏
int main(void)
{
long double ldMax = LDBL_MAX; //多精度浮点型最大值
long double ldMin = LDBL_MIN; //多精度浮点型最小值
printf("long double max:%llf\n", ldMax); //1.7976931348623158e+308
printf("long double min:%llf\n", ldMin); //2.2250738585072014e-308
return 0;
}