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

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. 数组每个字节赋值为1:
int a[100];
memset(a,1,sizeof(a));

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

00000001000000010000000100000001

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

  1. 数组每个字节赋值为-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时,数组元素的值才和字节的值相等。

常用的赋值:

  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。
  2. 如果是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。

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

单个变量赋值

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

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

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

  1. 赋值最小值: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];

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

  1. 可以将大小设为不大不小的中间值,如1000000,9999999等
    memset(a,127/3,sizeof(a)),全部初始化为707406378。
  2. 将int 改为long long、double,甚至使用高精度进行计算。
  • 22
    点赞
  • 53
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值