什么?用memcmp比较浮点数竟然比出了1.0大于2.0!莫慌,来看详解

memcmp是一个库函数,用来比较两个内存块的前num个字节;

该函数在头文件<string.h>中,函数定义为:int memcmp (const void *s1, const void *s2, size_t n);

代码演示 

#include<stdio.h>
#include<string.h>

int main()
{
	float arr1[] = { 1.0,2.0,3.0,4.0,5.0 };
	float arr2[] = { 1.0,1.0 };
	int ret = memcmp(arr1, arr2, 4);//比较arr1和arr2的前4个字节
	printf("%d\n", ret);//0
	ret = memcmp(arr1, arr2, 8);
	printf("%d\n", ret);//-1
	return 0;
}

这里细心的朋友会发现,第二次用memcpy比较时,竟然出现了1.0>2.0的情况,不必惊慌,结果是没有问题的。

首先我们要明确两点,一个是memcpy函数比较的是首个不同字节数值的大小,而不是长短,另一个就是要了解浮点数在内存中的储存规则。

若对于浮点数储存规则不了解,可见拙作进行了解C语言进阶笔记(一) | 深度剖析数据在内存中的存储_KYG__Y_O的博客-CSDN博客目录数据类型的基本归类类型的意义整型家族浮点数家族构造类型指针类型空类型整形在内存中的存储原码、反码和补码大小端介绍练习题练习1练习2练习3练习4浮点型在内存中的存储浮点数表示形式IEEE 754规定有效数字M的保存指数E的保存指数E从内存中取出练习题数据类型的基本归类类型的意义1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。2. 如何看待内存空间的视角。整型家族cha...https://blog.csdn.net/KYG__Y_O/article/details/119896867下面我们以memcmp函数的比较规则来比较下1.0和2.0 

1.0 转化为二进制是 1.0 

1.0 可以写成 (-1)^1.0*2^0

储存在内存中为

S  E+127                         M
0 01111111 00000000000000000000000

 也就是

0011 1111  1000 0000   0000 0000  0000 0000
    字节4        字节3           字节2           字节1

2.0 转化为二进制是 10.0 

10.0 可以写成 (-1)^0*1.0*2^1

储存在内存中为

S   E+127                         M
0 10000000 00000000000000000000000

也就是 

0100 0000  0000 0000  0000 0000  0000 0000
    字节4         字节3          字节2           字节1 

这样很明显可以看出二者字节1字节2相等,进而比较字节3,1.0中的字节3大于2.0中的字节3,所以此处比较结果是1.0>2.0。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天青i

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值