今天的学习日记来了,连补两天课,一共4节视频课,我懒的发布两篇日记了,写一篇好了。
今天的学习内容是:浮点数 类型转换 字符 推断类型
浮点数:
浮点数,通俗点说就是小数了(反正我是这么理解的),分为单精度和双精度还有一个long double,单精度浮点数 在C++中类型名称为 float,双精度浮点数 在C++中类型名称为 double,还有就是long double。
这里 float 是占用4字节的,double 是占用8字节的,在看B站网课的时候看到了 double和long double占用字节都是8字节,我就很好奇啊,那这两个占用字节一样,那有必要重复?我查了一下,发现不是这样,long double是C99规范新增加的数据类型,long double实际占用16字节,数字精度比double还要高出很多。
三者精度对比: float < double < long double
还有一点,就是比较有意思的例子:
int main()
{
float a = 200, b = 0.001, c = a + b;
std::cout << c;
}
运行结果为:200.001
看完上面的一个,你会发现一切都是对的,那我们再来看下面的例子:
int main()
{
float a = 200, b = 0.0001, c = a + b;
std::cout << c;
}
运行结果为:200
很有意思吧?这是因为float为6位精度,比如说,200.001,不管是小数点后还是小数点前,这个精度指的是总位数,也就是 2 0 0 0 0 1,六位。那到了第七位的时候就会被舍去而不是四舍五入,各位C++大佬可能会反驳,别急,再来看一下面两个例子:
int main()
{
float a = 200, b = 0.002578, c = a + b;
std::cout << c;
}
运行结果为:200.003
int main()
{
float a = 200, b = 0.002478, c = a + b;
std::cout << c;
}
运行结果为:200.002
结果差异在于,四舍五入,解释一下: float的精度为6位,如果强行赋值第7位,那么会根据第六位来判断是否四舍五入,当第六位是0时,第七位及其后所有位值均不会四舍五入,而全部直接变为0。
举个例子可能直观一点:
当变量b = 0.001678,则运行结果为 256.002
当变量b = 0.000678,则运行结果为 256
这样说大概懂了吧?
浮点数的表达:
单精度浮点数 float 是在小数最后一位后加 F或f[大小写F],具体如:973.14F或者973.14f,都是可以的。
不带后缀的浮点数,一般一律视为double双精度浮点数,具体如:973.14。
long double 是在小数最后一位后加L或l[大小写L],具体如:973.14L或者973.14l。
类型转换:
首先来看表
优先级(从下到上逐级递增) | 类型 |
最高 | long double |
. | double |
. | float |
. | unsigned long long |
. | long long |
. | unsigned long |
. | long |
. | unsigned int [unsigned] |
最低 | int |
先简单强记一下这个优先级表,然后再来看例子理解:
int main()
{
int a = 500;
unsigned b = 1000;
std::cout << (a - b);
}
你认为这个结果是什么? -500吗?实际不是,是一个特别离谱的值:4294966796,这是因为什么原因造成的呢?不仅是因为unsigned不支持负数的原因,还有是因为类型转换优先级问题造成的。在我们进行不同类型计算时,C++总是会以类型转换优先级高的数据类型作为输出类型。
当我们将这个例子中的unsigned换成 long long ,优先级高,支持负数,我们再来看一下结果:
int main()
{
int a = 500;
long long b = 1000;
std::cout << (a - b);
}
运行结果为:-500
这次结果就正常了不少对吧。
其实有三种方法可以解决上面的类型转换问题,首先是第一种:
int main()
{
int a = 500;
unsigned b = 1000;
a = a - b;
std::cout << a;
}
运行结果为:-500
这里重新给变量a本身赋值,而变量a是int类型的,支持负数,所以直接使用a = a - b就可以很好的解决这个问题。
第二种方法:
int main()
{
int a = 500;
unsigned b = 1000;
std::cout << (int)(a-b);
}
运行结果为:-500
这里是强制定义了计算后的类型为int,所以输出结果自然为int类型,正常输出。
第三种方法[静态转换]:
int main()
{
int a = 500;
unsigned b = 1000;
std::cout << static_cast <int> ((a-b));
}
运行结果为:-500
静态转换: static_cast <目标类型> ((要转换的内容))
也是非常好的就解决了这个问题,很简单,一行代码就够。
最后还有一个比较简单的知识点可以看看:
查看类型所占用的字节数:
sizeof(类型变量)
例子:
int main()
{
int a = 500;//不要在意这个值
std::cout << sizeof(a);
}
运行结果为:4
因为int类型占用的就是4字节,所以输出为4,没有问题。
字符:
直接来看一段代码:
int main()
{
sin::cout << (char)65 << std::endl;
}
这一段代码的运行结果为:A,原因是char在这里按照了ASCII码表输出了对应的字符。
ASCII码表是计算机基础,来看一下[搬自百度百科]:
大写的A对于的ASCII码为65,所以这里输出了A。
当前方是 cout 一类的输出时,char类型的数据会按照ASCII码表进行输出。
值得一提的是:大写A为65,小写a为97,相差32,也就是说所有字母的大小写都相差32。
困了,早上起来再写吧。
2月10号补两篇。