在编程中,有时我们需要初始化一个全为最大值/最小值的数组。
我们可以这样做:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5];
for(int i=0;i<5;i++) a[i]=0x7fffffff; //2^31-1
for(int i=0;i<5;i++) cout<<a[i]<<' ';
return 0;
}
这样,我们就把数组中每一个值都赋了最大的2147483647。
实际上这样不够快,我们可以用一个折中的办法:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[5];
memset(a,127,sizeof(a));
for(int i=0;i<5;i++) cout<<a[i]<<' ';
return 0;
}
数组中每个值都被赋了2139062143。
这是为什么呢?
memset函数是cstring库中的char数组初始化函数,它是一个字节一个字节初始化的,而int是四个字节。
因此,我们不能用memset为所欲为地初始化int数组,但是可以赋一些特殊值。
如上例,127的补码是01111111,我们使用127来初始化每个字节,这样一个int数就被赋了01111111 01111111 01111111 01111111 即2139062143的补码,它与真正的最大值只差一点,很多情况下可以做最大值用。
用-128来初始化每个字节,-128的补码是10000000,这样一个int数就被赋了10000000 10000000 10000000 10000000即-2139062144的补码,与最小值只差一点。
用128来初始化,128将被看作无符号数10000000,初始化结果和-128相同。
用0来初始化每个字节,0的补码是00000000,可以把数组内每个数都初始化为0。
用-1来初始化每个字节,-1的补码是11111111,可以把数组内每个数都初始化为-1。
我们也可以用memset搭配127,128,0给double赋近似最大、最小及0值,但是不能用-1,会nan。double的结构本身更复杂。
实际中我们也可以使用INT_MAX、DBL_MAX等常量。
附上补码表: