简要
$\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$