1.辨析原碼反碼補碼:
? ? ? ? 1.原碼:有32位(int類四個字節,一個字節八個比特位),第一位是符號位,0正1負,其余為二進制位。
? ? ? ? 2.計算一般是對原碼進行計算,但在負數計算使用原碼會導致程序出錯,所以負數計算中使用反碼,反碼就是除了符號位,其余位置取反,反碼存在的原因就是負數的計算
? ? ? ? 3.雖然有了反碼,但遇到負數跨0比如-6+7=1的問題時無法解決,所以產生了補碼,補碼等于負數的反碼加1
2.正整數的原碼補碼反碼都相等,負數的原碼正常,反碼為第一位不變其余位按位取反,補碼位反碼加一
3.在整形存儲中一般以補碼的形式存在,因為這樣可以使符號位與數值位統一處理,加法和減肥都可以統一處理(cpu只有加法器),其運算過程是相同的不需要額外硬件
4.大端和小端:超過1字節的數據在存儲的時候就會存儲順序的問題,按照不同的存儲順序,分為大端字節序存儲和小端字節序存儲:
? ? ? ? 1.大端模式:數據的低位字節內容保存在內存的高地址處,數據的高位字節內容保存在內存的低地址處
? ? ? ? 2.小端模式:低位字節內容保存在內存的低地址處,高位字節內容保持在高地址處
5.大小端存在的原因:
6.判斷大小端的方法
7.例題:
析題:在內存中,數據儲存首先進行一個截斷操作,將變量補碼的后八位取出,然后會進行一個還原操作,會用符號位的數值將截斷碼補成32位,補充之后的碼繼續作為原碼。以‘%d'的形式打印,就是打印一個十進制有符號的整數,而操作對象是變量的補碼,a,b兩個變量的補碼的運算結果為-1,而c的補碼首位是0.所以它的補碼等于原碼等于它本身,所以是255
8.例題2:
析題:內存存儲
%u表示打印十進制無符號整型,上表表示了在內存中所有有符號字符型的存儲可能(8個字節),可以發現范圍是+127到-128,而中間的0000000會自動解析為128,無符號字符型的取值為0到255,
而無符號整型的補碼是它自己,直接把128的補碼的截斷補充的形式打印出來
9.例題3
答案是256,為啥?
析題:
char類型的整型范圍有以上規律,是一個閉合的環,而strlen函數就是找\0,而'\0'的asc碼值為0,就是找char 0的位置,按照上圖正好循環一圈,為255個數
10.例題4
析題:無符號整型也是一個閉環,0-1等于2的33次方-1(2的33次方減1然后加一為2的33次方,但int只能儲存2的32次方,所有按照截斷方法來看該值就是0),就是所有位都是1然后再減。
11.在強轉出現時,應先計算右側式子,然后再進行強轉
12.例題五
析題:
先假設數據的存儲是小端類型:
01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00
p1取的是數組的地址,加一代表指針指向了數組最后一個元素的后面,此時指針類型為數組指針,
此時將指針轉化為int*型,每次進行運算時移動四個字節,而p1[-1]代表向前移動四個字節,然后讀取,為4,而p2的運算,依據11,指向2的同時進行類型轉換為int類型,而轉換為int類型的同時編譯器會讀取向后的四位為一個數字2000000,前面的0不讀取,然后轉換為int*類型然后讀取打印,結果為2000000。
?