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

  • Post author:
  • Post category:其他




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,二进制表示为:

00000001 00000001 00000001 00000001

所有a数组中每一个数的值为:2

0

+ 2

8

+ 2

16

+ 2

24

=16843009。

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

负数的二进制在计算机中用补码形式存在,负数的补码为负数的绝对值的二进制取反后加1.

如-5的二进制表示:

5的二进制:0101

5的反码:1010

-5的补码:1010+1=1011

-1的补码为11111111

因此,数组元素二进制表示为:

11111111 11111111 11111111 11111111

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

00000000 00000000 00000000 00000001

因此,负数的二进制计算出来为-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,每两个数组成一个字节,最后组成的二进制就是:
7f ff ff ff
01111111 11111111 11111111 11111111

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

  1. 赋值最小值:0x80000000

    int类型的最小值,最后转化为二进制就为1000…00,总共31个0,为-2

    31

    =-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,甚至使用高精度进行计算。



版权声明:本文为STRVE原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。