【C基础】memset

最近写一个函数,需要对输入的参数(输入参数类型不一样)进行清零,一开始打算自己写,然后需要判断输入参数的类型等等,发现好麻烦,想起了memset,就想着研究下实际原理;

头文件

选其中一个就好

#include <memory.h>
#include <string.h>

memset

void *memset(void *s, int c, size_t n);

分析使用

void *(memset) (void *s,int c,size_t n)
{
	const unsigned char uc = c; 	/**< c转化为char型 0x00~0xFF*/
	unsigned char *su;				
	for(su = s;0 < n;++su,--n)		/**< s转化为指向char型的指针 */
	*su = uc;						/**< 赋值 */
	return s;
}

由源码我们可以分析到:注意!!!

  • 将需要赋值的参数,转化为指向char型的指针(大小端问题要注意)
  • 赋值的值,c转化为char型,所以实际范围:0x00~0xFF(一个字节)
  • 所以如果赋值对象大于一个字节,那么就是一个字节一个字节赋值
例子1:
int a;
memset(&a, 1, sizeof(a));

输出:

a: 0x01010101

如果理解了上面写的内容,那么例子1也就顺理成章了

例子2:(大小端问题)
int a;
memset(&a, -8, sizeof(a));

小端输出:

a: 0xF8F8F8F8

大端输出:(没有试验过)

a: 0xFFFFFFF

首先int型 -8(0xFFFFFFF8),
小端:
取低字节,0xF8
大端:
取高字节,0xFF

补码知识

https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
以char型为例

[+1] = [00000001]原 = [00000001]反 = [00000001]补
符号位不变
[-1] = [10000001]原 = [11111110]反 = [11111111]补

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值