首页 > 编程知识 正文

memset第二个参数改为0是什么作用,memset可以初始化的数据类型

时间:2023-05-04 02:15:56 阅读:256768 作者:2211

memset初始化详解+变量初始化最大值、最小值

计算机是使用二进制进行存储的,每一个二进制称为1位(bit),每8位称为1字节(Byte,B),1024字节称为1千字节(KB),1024千字节称为1兆字节(MB)。
换算关系:
1MB=1024KB
1KB=1024B
1B=8bit
int大小为4字节,double大小为8字节,long long 大小为8字节,char大小为1字节。

memset

memset是按照字节进行赋值,即对每一个字节赋相同值,可以对数组进行整体赋值。
基本格式:
memset(数组名,值,sizeof(数组名)); (C++需要头文件:cstring)

数组整体赋值

下面举两个例子,帮助大家理解。

数组每个字节赋值为1: int a[100];memset(a,1,sizeof(a));

int大小为4字节,每个字节8位,共32位。将每一个字节赋值为1,二进制表示为:

00000001000000010000000100000001

所有a数组中每一个数的值为:20+ 28+ 216 + 224=16843009。

数组每个字节赋值为-1: int a[100];memset(a,-1,sizeof(a));

负数的二进制在计算机中用补码形式存在,负数的补码为负数的绝对值的二进制取反后加1.
如-5的二进制表示:
5的二进制:0101
5的反码:1010
-5的补码:1010+1=1011
-1的补码为11111111
因此,数组元素二进制表示为:

11111111111111111111111111111111

现在将上面的二进制进行计算。第一位为符号位,表示负数。负数的二进制计算为减1,取反,结果为:

00000000000000000000000000000001

因此,负数的二进制计算出来为-1。
所有,a数组中每一个元素的值为-1。

同理,当按照字节赋值为0时:

int a[100];memset(a,-1,sizeof(a));

数组元素的值也为0。
使用memset对数组赋值时,只有字节赋值为0和-1时,数组元素的值才和字节的值相等。

常用的赋值: 如果是int数组:
int类型范围:-2147483648~2147483647
memset(a,127,sizeof(a)),全部初始化为int的较大值,即2139062143(int 最大值为2147483647);
memset(a,0,sizeof(a)),全部初始化为0;
memset(a,-1,sizeof(a)),全部初始化为-1;
memset(a,128,sizeof(a)),全部初始化为一个很小的数,比int最小值略大,为-2139062144。如果是double数组:
double类似范围为:-1.7e+308~1.7e+308
memset(a,127,sizeof(a)),全部初始化为一个很大的数1.38e+306;
memset(a,0,sizeof(a)),全部初始化为清0;
memset(a,128,sizeof(a)),全部初始化为一个很小的数-2.93e+306。

以上都是常用的最大值,最小值赋值,其他赋值请不要轻易使用,为了验证是否初始化正确,可以初始化后输出其中的一个数进行查看。

单个变量赋值

有时候需要对单个变量赋值。

赋值最大值 :0x7fffffff 或 0x7FFFFFFF
int是4字节。每个字节8位,总共32位。
0x表示的是十六进制,十六进制7对应二进制0111,十六进制f对应二进制1111,共7个f,每两个数组成一个字节,最后组成的二进制就是: 7fffffff01111111111111111111111111111111

刚好是int 的最大值,即2147483647。

赋值最小值:0x80000000
int类型的最小值,最后转化为二进制就为1000…00,总共31个0,为-231=-2147483648。

这种方式适合单个变量赋值,最大值,最小值比较的初始化。
如果需要整体赋值,使用for循环一个一个赋值。需要整体赋值,使用memset。

注意事项

当赋值为较大值或者较小值时,进行加法、减法、乘法计算时会产生溢出。如:

int a=0x7fffffff,b=0x7fffffff;a=a+b;

或者:

int a[100]memset(a,127,sizeof(a));a[5]=a[4]*a[3];

赋值为最小值时,继续作减法,也会溢出。
所有,当变量已经是很大的值或很小的值,如果继续进行加法、乘法,会超过类型的大小限制,造成溢出。
因此当赋值较大值或较小值时,一定要注意是否会出现溢出的情况。
为了防止这种情况发生,有如下方法:

可以将大小设为不大不小的中间值,如1000000,9999999等
memset(a,127/3,sizeof(a)),全部初始化为707406378。将int 改为long long、double,甚至使用高精度进行计算。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。