简要
\(\texttt{memset}\) 原用处是初始化 \(\texttt{char}\) 用的,故是按 \(\texttt{1}\) 个字节为单位初始的。
但现在也用于数组。
用法
memset(数组名字,值,sizeof 数组名字)
这里的 sizeof
并非函数,而是单目运算符
例:
#include<bits/stdc++.h>
using namespace std;
int a[114514];
signed main()
{
memset(a,0x3f,sizeof a);
cout<<a[1]<<"\n";
return 0;
}
运行结果:
1061109567
为什么?
因为上面说是按照 \(1\) 个字节初始的,\(1\) 个 \(\texttt{int}\) 占 \(4\) 个字节,
所以每个数组的值是 \(\texttt{0x3f3f3f3f}\),也就是 \(10\) 进制下的 \(1061109567\)
注意:里面的数值是以补码存储的
-
正数和原码一样
-
负数在反码基础上 \(+1\).
所以 memset(a,255,sizeof a)
后每一位就是 \(11111111\),四位就是 \(32\) 个 \(1\)
但由于第一位是符号位,且是以补码形式存储的。
所以该数为负,并且 \(111\dots\) 共 \(31\) 个 \(1\) \(- 1\) (补转原)后取反就为 \(1\)(省略前导 \(0\))
转十进制就是 \(1\),加上符号就是 \(-1\)。
所以每一个 \(a_i\) 是 \(-1\)。
补充
当数值转 \(2\) 进制超过 \(8\) 位那超过的就舍掉,保留后 \(8\) 位。
例:
memset(a,257,sizeof a)
\(257_{10} = 100000001_{2}\)
后八位就是 \(00000001\)
四位就是 \(00000001000000010000000100000001\)
也就是 \(16843009_{10}\)
所以每一个 \(a_i\) 是 \(16843009\)
后记
如果有问题、意见欢迎私信本蒟蒻或者在评论指出
求点赞