今天寫memset函式的時候遇到了老生常談的話題,
這裡沒有出現意料中的1而是16843009。
網上查詢了資料後,發現,memset函式是按位元組儲存。語法如下
而char大小是乙個位元組。memset函式其實又稱為char陣列初始化函式,
在初始化時對從buffer指標處開始的連續size_t個位元組按位元組進行初始化賦值為ch。
對於char型別陣列,每個元素恰好是乙個位元組,因此是毫無問題的。
對於int型別陣列,每個元素是四個位元組,因此在賦值的時候等於乙個元素被按位元組賦值了四次,如題的賦值為1時,按位賦值時是這樣的:
0x01010101
對於char元素則是賦值為0x01而已。而0x01010101轉換為十進位制則是16843009。
memset函式初始化int陣列時還可以初始化為-1和0.true和false等價於0和1。
因為對於整型資料在計算機中的儲存方式是按照二進位制補碼的方式儲存的。
二進位制儲存的編碼方式有原碼,反碼,補碼。
表示方式為:符號位+數值位。
符號位0為整數1為負數
原碼的數值位即教科書上的x進製轉換二進位制時的數字,
反碼,正數的反碼是原碼本身。負數的反碼則是符號位不變,數值位取反
補碼,正數的補碼是原碼本身,負數的反碼則是符號位不變,數值位取反再+1(反碼基礎上+1)
舉例:
1的原碼為:0000 0001
補碼反碼同上。。。
-1的原碼為:1000 0001
反碼:1111 1110
補碼:1111 1111
上面舉例的是1這個數值按照八位二進位制表示。如果是int整型四個位元組32位的。則是:0000 0000 0000 0000 0000 0000 0000 0001
即中間數值位補足0。。
上邊提到整型資料在計算機中的儲存方式是補碼。為表示簡單,下面用十六進製制表示了、、、
因此當memset函式為乙個int元素賦初值為0的時候,
是這樣的
0x00 00 00 00 ,
很明顯結果為0。
當為memset函式為乙個int元素賦初值為-1時,
為直觀表示,轉化為二進位制如下,是這樣的:
1000 0001 1000 0001 1000 0001 1000 0001
對應的補碼為:
1111 1111 1111 1111 1111 1111 1111 1111
個人理解為,當memset為int資料第乙個位元組進行初始化賦值時,
計算機是當前這個位元組的數值用補碼形式儲存起來。而不是等四個四節都賦初值後將其作為乙個32位(4位元組)資料再儲存起來。這是有區別的。第一種其補碼對應如上,第二種的補碼則是
1111 1110 1111 1110 1111 1110 1111 1111
對應的十進位制資料是1229782933952336144。
memset函式賦初值問題
我的第一篇部落格。今天寫memset函式的時候遇到了老生常談的話題,這裡沒有出現意料中的1而是16843009。網上查詢了資料後,發現,memset函式是按位元組儲存。語法如下 而char大小是乙個位元組。memset函式其實又稱為char陣列初始化函式,在初始化時對從buffer指標處開始的連續s...
memset與for迴圈賦初值比較
寫 的時候思考了一會兒memset初始化快還是for迴圈初始化快。看了大量的文獻資料,結論如下 如果對於乙個陣列進行賦初值操作,memset肯定比for迴圈快 memset賦初值是按位元組為單位的,如果要賦一些比較難的值 33,22等 就比較難 接上,因為memset是按位元組為單位賦初值,當變數所...
memset 賦初值為無窮大和無窮小
如果問題中各資料的範圍明確,那麼無窮大的設定不是問題,在不明確的情況下,很多程式設計師都取0x7fffffff作為無窮大,因為這是32 bit int的最大值。如果這個無窮大只用於一般的比較 比如求最小值時min變數的初值 那麼0x7fffffff確實是乙個完美的選擇,但是在更多的情況下,0x7ff...