C语言回顾day3(一)


第三章的后半部分

_Bool类型

三行字,就这么简单
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

复数类型 虚数类型

在这里插入图片描述

在这里插入图片描述

由基本数据类型衍生的数据类型:数组,指针,联合,结构

在这里插入图片描述

浮点数类型(float, double, long double)

float只能保证小数点后6位的精度

浮点数的存储原理:只存储指数和尾数,一般指数分多少位,尾数又分多少位
在这里插入图片描述在这里插入图片描述
这个试验可以验证

#include <stdio.h>
int main()
{
    float x = 1.2;
    double y = 2.4;
    printf("%d, %d, %d", sizeof(x), sizeof(y), sizeof(3.8));
    return 0;
}
4, 8, 8

我想试试floatfloat和doubledouble再截短为float会不会有精度的区别,做了下面这个实验,两种运算得到的结果是一样的!!

#include <stdio.h>
int main()
{
    float x, y;
    x = 1.245623451234f * 2.5454667841234f;
    y= 1.245623451234 * 2.5454667841234;
    printf("%f, %f", x, y);
    return 0;
}
3.170693, 3.170693
#include <stdio.h>
int main()
{
    printf("float: %f, %e\n", 123400.0f, 123400.0f);
    printf("double: %f, %e\n", 123400.0, 123400.0);
    printf("long double: %lf, %le\n", 123400.0L, 123400.0L);
    printf("long double: %d\n", sizeof(123400.0L));
    return 0;
}

不知道为啥long double会出错

float: 123400.000000, 1.234000e+005
double: 123400.000000, 1.234000e+005
long double: -254364564242548150000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000.000000, 8.102183e-320
long double: 12

浮点数上溢overflow

#include <stdio.h>
int main()
{
    printf("float: %f, %e\n", 2.0e38f, 2.0e38f);
    printf("float: %f, %e\n", 2.0e39f, 2.0e39f);
    return 0;
}

10的38次方还能正确表示,不过注意实际上存储的并不是精精准准的200000000······哦

10的39次方就超出范围了,编译器打印INF

float: 199999993605713850000000000000000000000.000000, 2.000000e+038
float: 1.#INF00, 1.#INF00e+000

浮点数下溢(underflow 比上溢更复杂)

在这里插入图片描述

NaN也算浮点值!!!长知识了
在这里插入图片描述

不举例子还是不明白

但是我暂时找不到例子

·······

sizeof运算符

在这里插入图片描述

#include <stdio.h>
int main()
{
    printf("%d, %d, %d, %d, %d\n", sizeof(char), sizeof(short), sizeof(int), sizeof(long), sizeof(long long));
    printf("%d, %d, %d\n", sizeof(float), sizeof(double), sizeof(long double));
    return 0;
}
1, 2, 4, 4, 8
4, 8, 12

我用%d也用的好好的!!!如果用%zd,反而还出错了·····不知道为啥

后面添加:这是因为我没选择编译器使用的C标准,选择c99或者C11就不会出错了,也会得到正确结果

需要注意的是,虽然这里%d的结果对了,但是sizeof运算符本身返回的数据应该是无符号的整型,所以最为准确的应该用%u, %lu, %llu。%zd就是为了解决这个问题的,直接用%zd,不用考虑到底用%u, %lu, %llu的哪一个都不会出错。
在这里插入图片描述
在这里插入图片描述

zd, zd, zd, zd, zd
zd, zd, zd

sizeof只是对象是类型是必须加圆括号
在这里插入图片描述

1字节并不一定是8位哦!!!C规定了char类型占的位数为1字节,所以才是8位,如果char占16位,那一个字节就是16位,double就占4字节咯

这一点真实没注意过,一直以为一个字节就是死死的8bit
在这里插入图片描述在这里插入图片描述

参数

在这里插入图片描述在这里插入图片描述在这里插入图片描述

上图的最后一个红框让我回忆起昨天看的内容,scanf和printf无法检测占位符和后面参数的数量是否相等······看了红框的描述,我还是觉得编译器或者函数本身应该可以完成这件事情·······不明白为啥没做

要是占位符和后面参数的个数不相等啦,类型不匹配啦,编译器并不报错,于是就产生了陷阱!!!想起了那本书:C陷阱与缺陷,不知道有没有可能也写到这一点呢

printf输出:刷新缓冲区

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值