C语⾔ 数据存储和内存函数

 1,整数在内存中的存储

整数的2进制表⽰⽅法有三种,即 原码、反码和补码

三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最
⾼位的⼀位是被当做符号位,剩余的都是数值位
正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:反码+1就得到补码。

2,int的数据在内存中的存储

我们知道数据存储在内存当中,二内存存储的最小单位是字节,比如说char类型大小是一个字节,那它的数据就存在一个内存单元中,那int,long,short这些类型呢,以int为例展开说

int大小是四个字节,以十六进制0x11223344数据为例(十六进制的两个位数是八个比特位),显然int中的一个字节是无法存储此数据的,那就需要四个字节同时存储,分别存 0x11,0x22,0x33,0x44,

2,大小端存储

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分 为⼤端字节序存储和⼩端字节序存储,下⾯是具体的概念:
⼤端(存储)模式:是指数据的低位字节内容保存在内存的⾼地址处,⽽数据的⾼位字节内容,保存 在内存的低地址处。
⼩端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,⽽数据的⾼位字节内容,保存 在内存的⾼地址处。

3,关于一些内存函数模拟实现

1,memcpy
函数memcpy从开始(str)的位置开始向后复制count个字节的数据到dest指向的内存位置。
这个函数在遇到 '\0' 的时候并不会停下来。
如果source和destination有任何的重叠,复制的结果都是未定义的。
// 模拟实现memcpy
#include<stdio.h>
void* my_memcpy(void* dest, void* str, size_t count)
{
	void* ret = dest;
	while (count--)
	{
		*((char*)dest) = *((char*)str);
		dest = (char*)dest + 1;
		str = (char*)str + 1;
	}
	return ret;
}
int main()
{
	int arr1[] = { 1,2,3,4,5,6,7,8,9 };
	int arr2[] = { 9,8,7,6,5,4,3,2,1 };
	void* ret=my_memcpy(arr1, arr2, 5*sizeof(int));
	for (int i = 0; i < 9; i++)
		printf("%d ", arr1[i]);
	return 0;
}

2,   memmove
和memcpy的差别就是memmove函数处理的源内存块和⽬标内存块是可以重叠的。
如果源空间和⽬标空间出现重叠,就得使⽤memmove函数处理。
//模拟实现memmove
#include<stdio.h>
void* my_memmove(void* dest, void* str, size_t count)
{
	void* ret = dest;
	if (dest < str)
	{
		while (count--)
		{
			(char*)dest = (char*)str;
			dest = (char*)dest + 1;
			str = (char*)str + 1;
		}
	}
	else
	{
		while (count--)
		{
			*((char*)dest + count) = *((char*)str + count);
		}
	}
 return ret;
}
int main()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	void*  ret =my_memmove(arr + 2, arr, 5 * sizeof(arr[0]));
	for (int i = 0; i < 9; i++)
		printf("%d ", arr[i]);
	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值