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,二进制表示为:
00000001 | 00000001 | 00000001 | 00000001 |
---|
所有a数组中每一个数的值为:2
0
+ 2
8
+ 2
16
+ 2
24
=16843009。
- 数组每个字节赋值为-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时,数组元素的值才和字节的值相等。
常用的赋值:
-
如果是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,每两个数组成一个字节,最后组成的二进制就是:
7f | ff | ff | ff |
---|---|---|---|
01111111 | 11111111 | 11111111 | 11111111 |
刚好是int 的最大值,即2147483647。
-
赋值最小值: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];
赋值为最小值时,继续作减法,也会溢出。
所有,当变量已经是很大的值或很小的值,如果继续进行加法、乘法,会超过类型的大小限制,造成溢出。
因此当赋值较大值或较小值时,一定要注意是否会出现溢出的情况。
为了防止这种情况发生,有如下方法:
-
可以将大小设为不大不小的中间值,如1000000,9999999等
memset(a,127/3,sizeof(a)),全部初始化为707406378。 - 将int 改为long long、double,甚至使用高精度进行计算。