memset初始化問題

memset填充方式是以1字節爲單位對內存進行填充,對於數組進行初始化

int a[2];
    memset(a,0,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    memset(a,-1,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;
    memset(a,1,sizeof(a));
    for(int i=0; i<2; i++)
    {
        cout<<a[i]<<' ';
    }
    cout<<endl;

猜猜運行結果?


可以看到memset成功對數組進行了0與-1的初始話,可是爲什麼1卻不行呢,這就要用到上面提到的memset的工作方式了,首先,int類型的整數在計算機中的存儲方式爲補碼,4字節。

未初始化默認保存爲

00000000 00000000 00000000 00000000

按0初始化,以爲原本默認值就是0,所以還是原來的情況

按1初始化

00000001 00000001 00000001 00000001

將每一個字節均賦值爲1,由於正數補碼與原碼相同,所以得到了如圖所示的結果

按-1初始化,將每一個字節初始化爲-1

11111111 11111111 11111111 11111111

可以發現經過補碼到源碼的變換後,原碼爲

10000000 00000000 00000000 00000001

這恰恰是-1的原碼,所以對於0和-1的初始化成功純屬巧合,而對於其他數像1等就無法做到


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章