先從一到面試題說起:
#includeusing namespace std;
int main()
輸出結果為: 0
0 -5
66在上面已經知道float型125.5在記憶體中存放方式為:
00000000 低位址
00000000
11111011
01000010 高位址
因此對於p和p+1指向的單元,其中儲存的二進位制數表示的十進位制整數為0;
而對於p+2指向的單元,由於為char型指標,為帶符號的資料型別,因此11111011,符號位為1,則為負數,由於在記憶體中二進位制是以補碼儲存的,所以其真值為-5.對於p+3指向的單元,01000010,為正數,則其大小為66。上面程式輸出結果驗證了其正確性。
3. 關於原碼、補碼、反碼和移碼(增碼)
原碼:
如果機器字長為n,那麼乙個數的原碼就是用乙個n位的二進位制數,其中最高位為符號位:正數為0,負數為1。剩下的n-1位表示概數的絕對值。
例如: x=+101011 , [x]原= 00101011 x=-101011 , [x]原= 10101011
位數不夠的用0補全。
ps:正數的原、反、補碼都一樣:0的原碼跟反碼都有兩個,因為這裡0被分為+0和-0。
反碼:
知道了什麼是原碼,那麼你只需要具備區分0跟1的能力就可以輕鬆求出反碼,為什麼呢?因為反碼就是在原碼的基礎上,符號位不變其他位按位取反(就是0變1,1變0)就可以了。
例如:x=-101011 , [x]原= 10101011 ,[x]反=11010100
補碼:
補碼也非常的簡單就是在反碼的基礎上按照正常的加法運算加1。
例如:x=-101011 , [x]原= 10101011 ,[x]反=11010100,[x]補=11010101
ps:0的補碼是唯一的,如果機器字長為8那麼[0]補=00000000。
移碼:
移碼也叫增碼,移碼最簡單了,不管正負數,只要將其補碼的符號位取反即可。
例如:x=-101011 , [x]原= 10101011 ,[x]反=11010100,[x]補=11010101,[x]移=01010101
int a和 int a的區別
cpp view plain copy include include include using namespace std intmain int a static cast a int a reinterpret cast a int a 不經過轉換,直接得到a在記憶體單元的值,並將其轉換成整...
int a和 int a的區別
float a 1.0f cout int a endl cout int a endl cout boolalpha int a int a endl 1 輸出什麼?float b 0.0f cout int b endl cout int b endl cout boolalpha int b ...
int a和 int a的區別
float a 1.0f cout int a endl cout int a endl cout boolalpha int a int a endl 1 輸出什麼?float b 0.0f cout int b endl cout int b endl cout boolalpha int b ...