ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

C语言-内存函数和数据存储

C语言-内存函数和数据存储 目录内存函数memcpy函数memmove函数memset函数memcmp函数数据在内存中的存储整数的存储大小端字节序存储大端字节序存储小端字节序存储浮点数的存储内存每一个字节的分配浮点数的存储过程S、M、E浮点数读取的过程内存函数memcpy函数内存拷贝函数函数定义void* memcpy(void* destination,const void* source,size_t num);memecpy函数完成对内存块的拷贝不关注内存中的数据类型num代表要复制的字节个数主要复制两个内存未重叠的情况使用时需要包含头文件stdio.hint main() { int arr1[] { 1,2,3,4,5,6,7 }; int arr2[] { 7,7,7,7,7 }; memcpy(arr11, arr2, 8);//此处可以通过指针的运算来控制复制的内容 for (int i 0;i 7;i) { printf(%d , arr1[i]); } return 0; }memmove函数是memcpy函数的升级版两个内存存在重叠的情况也可以拷贝其余参数函数定义都一样。对memmove函数进行模拟实现代码如下#includestdio.h #includestring.h void* my_memmove(void* dest, const void* src, size_t num) { void* ret dest; if (dest src) { while (num--)//从左向右 { *(char*)dest *(char*)src; (char*)dest (char*)dest1; (char*)src (char*)src 1; } } else { while (num--)//从右向左 { *((char*)dest num) *((char*)src num); } } return ret; } int main() { int arr1[] { 1,2,3,4,5,6,7 }; int arr2[] { 7,7,7}; my_memmove(arr12, arr11, 12); for (int i 0;i 7;i) { printf(%d , arr1[i]); } return 0; }memset函数内存设置函数函数定义void* memset(void* ptr,int value,size_t num);三个参数分别是起始地址要设置的值要设置的字节长度其返回值是要设置空间的起始地址。用于设置内存块内容将指定长度空间内容设置为特定内容程序会将自动将int value转换为unsigned char类型所以只能一个字节一个字节的设置num的单位是字节#includestdio.h #includestring.h int main() { int arr[] { 1,2,3,4,5,6 }; memset(arr, 1, 4);//将arr的前四个字节改为1 for (int i 0;i 6;i) { printf(%d , arr[i]); } return 0; }memcmp函数内存空间比较函数函数定义int memcmp(const void* ptr1,const void* ptr2,size_t num);该函数是以字节为单位进行比较num的单位是字节其返回值根据ptr1和ptr2大小关系相关#includestdio.h #includestring.h int main() { int arr[] { 1,2,3,4,5,6 }; int arr1[] { 1,2,3,5,6 }; int a memcmp(arr, arr1, 12);//比较arr和arr1的前12个字节相等返回0 int b memcmp(arr, arr1, 16);//比较arr和arr1的前16个字节arrarr1.返回-1 printf(%d\n, a); printf(%d\n, b); return 0; }数据在内存中的存储整数的存储整数在内存中以补码的形式存储。大小端字节序存储不同的操作系统采用的字节序存储方式不同。大端字节序存储数据的高位存放在内存的低位地址中数据的低位存放在内存的高位地址中。(和打印出来的顺序一致通过网络传输数据是大端存储)小端字节序存储数据的高位存放在内存的高位地址中数据的低位存放在内存的低位中。和打印出来的顺序刚好相反用一个小程序判断操作系统是哪种字节序存储方式int main() { int a 1; if (*(char*)a 0)//将a的地址转换成一个字符指针调用第一个字节来判断 { printf(大端存储); } else { printf(小端存储); } return 0; }浮点数的存储任意一个浮点数V可以表示为V -1^S * M * 2 ^ E^表示次方类似于十进制数的科学计数法。-1^S符号位S0为正数S1为负数M有效数字1M2E表示位数内存每一个字节的分配32位的float,最高一位存储S接着8位存储E剩下23位存储M64位的double,最高一位存储S接着11位存储E剩下52位存储M.浮点数的存储过程S、M、ES正常存储M只存储小数部分不存储“1”在读取时会自动加1E为无符号整形 数据存储时要加上一个正整数进行校正32位float需要加上12764位double需要加上1023.PS整数和浮点数在内存中的存储方式不同由于小数部分2的负次方值的原因有些浮点数是不能精确保存的数学上相同的两个式子作为判断条件时避免出错可做差与定义的误差进行比较判断。浮点数读取的过程分为三种情况E不全为0或E不全为1常规情况从内存中提取出S、M、ES正常判断正负M1E127或者1023正常合并计算E全为0从内存中提取出S、M、EE 1 - 127或者1023M不用1直接还原为0.xxxxxxxx一个接近于零很小的小数E全为1表示正负无穷大正负号取决于S。
返回列表