问题:
memset为什么不能取到极值?为什么memset(a,1e5,sizeof a)不会使得元素变成1e5?
分析:
以下是猜想:
假设有memset(a,X,sizeof a)。
当输入X时,如果是十六进制,先把它转为十进制
X=(X%256+256)%256
将X转为十六进制,现在有两位,我们设为AB
扩到8位,ABABABAB
令a[]=ABABABAB的补码
跑了下没错,应该是猜对了
int a[2],bit[40];
void solve()
{
for(int i=-1e6;i<=1e6;i++)
{
memset(a,i,sizeof a);
int x=i;
x=(x%256+256)%256;
for(int j=1;j<=32;j++) bit[j]=x&1,x/=2;
for(int j=9;j<=32;j++) bit[j]=bit[j-8];
if(bit[32])
{
for(int j=1;j<=31;j++) bit[j]^=1;
bit[1]++;
for(int j=1;j<=32;j++) if(bit[j]==2) bit[j]=0,bit[j+1]++;
}
int ans=0,pw=1;
for(int j=1;j<=31;j++) ans+=pw*bit[j],pw*=2;
if(bit[32]) ans=-ans;
if(a[0]!=ans)
{
cout<<i<<" "<<a[0]<<" "<<ans<<endl;
return;
}
}
}
解释一下问题:不能令X=255取最大值,因为有符号位最高位表示正负,所以这样反而变成了负数。最小值同理。实际上最小值在X=128时取到,最大值在X=127时取到。而第二个问题就很显然了。