最近写一个函数,需要对输入的参数(输入参数类型不一样)进行清零,一开始打算自己写,然后需要判断输入参数的类型等等,发现好麻烦,想起了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]补