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的博客-优快云博客目录数据类型的基本归类类型的意义整型家族浮点数家族构造类型指针类型空类型整形在内存中的存储原码、反码和补码大小端介绍练习题练习1练习2练习3练习4浮点型在内存中的存储浮点数表示形式IEEE 754规定有效数字M的保存指数E的保存指数E从内存中取出练习题数据类型的基本归类类型的意义1. 使用这个类型开辟内存空间的大小(大小决定了使用范围)。2. 如何看待内存空间的视角。整型家族cha...https://blog.youkuaiyun.com/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。