如果scanf格式错误会发生什么?

如果scanf格式错误会发生什么?做大一的C语言实验时遇到一个有趣的事情,为什么float强制转换成double不会造成任何问题,而scanf("%f", &double), 则完全不同呢?下面是我的一点看法我想这是程序在做强制类型转换的时候会知道我从哪里来32位(单精度浮点数),我要到哪里去64位(双精度浮点数),编译器能够很好的做到这一点,进行阶码和尾数单精度到双精度的转换,所以完全没有问题。而scanf的"%f"接受float类型的指针,所以其把&double当做float对待
摘要由CSDN通过智能技术生成

如果scanf格式错误会发生什么?

做大一的C语言实验时遇到一个有趣的事情,为什么float强制转换成double不会造成任何问题,而scanf("%f", &double), 则完全不同呢?下面是我的一点看法

我想这是程序在做强制类型转换的时候会知道我从哪里来32位(单精度浮点数),我要到哪里去64位(双精度浮点数),编译器能够很好的做到这一点,进行阶码和尾数单精度到双精度的转换,所以完全没有问题。

scanf"%f"接受float类型的指针,所以其把&double当做float对待,会将用户输入的值赋值到&double的低32位(小端法),对于低32位全是尾数的双精度浮点数来说几乎没有影响,转化为10进制时还是得看高32位,所以我们的输入就丢失了

回想起大二刚学C语言的时候,知道这是bug,但不知道这为什么是bug的茫然感。在(0|1)*****->anything的道路上越走越远。虽然java在web端很优秀,python在数据分析,人工智能领域很棒,但要和冯诺依曼体系下的计算机做朋友还得看C。

通过不断的学习,可以知道强制类型转换在底层有一条指令进行机器码的转换,否则就会直接按照指定的格式进行解释,见文尾

下面是在ubuntu上的实践过程

double a, b, c;
double area, perimeter, s;
printf("Enter 3 sides of the triangle: ");
scanf("%lf%lf%lf", &a, &b, &c);

Input:3 4 5

我们考虑这个例子,首先考虑浮点数在内存中的存储方式,通过使用gdb调式可以知道a,b,c的存储地址,如下所示

(gdb) p &a
$2 = (double *) 0x7fffffffde48
(gdb) p &b
$3 = (double *) 0x7fffffffde50
(gdb) p &c
$4 = (double *) 0x7fffffffde58

问题一:为什么a的存储地址与b的存储地址只相差了2呢

我们知道double是双精度浮点数,在内存中的存储应该是64位,这里两者相差仅2个字节,这是为什么呢?然后我通过x/24bt指令查看从0x7fffffffde48开始24字节的值

(gdb) x/24bt &a
0x7ffffff
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值