C++ 自学日记(3)

这篇博客记录了C++自学过程中的知识点,包括浮点数的精度与表示(float、double、long double),类型转换的优先级问题以及如何避免错误,以及字符在C++中的ASCII码表示。通过实例展示了浮点数舍入规则,并探讨了类型转换的三种解决方案。
摘要由CSDN通过智能技术生成

今天的学习日记来了,连补两天课,一共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号补两篇。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值