简要

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

最后修改:2023 年 05 月 04 日
如果觉得我的文章对你有用,请随意赞赏