memset初始化問題
阿新 • • 發佈:2018-11-18
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等就無法做到