(乾貨)詳解資料儲存(中) 整型

2021-10-19 08:37:54 字數 1662 閱讀 2417

上一章節講解了進製,為下面的兩章做了乙個簡單的鋪墊,下面對整型的儲存模式進行詳解。

計算機中的有符號整數有三種表示方法:原碼、反碼、補碼(無符號數和正數的原碼、反碼、補碼均相同);

三種表示方法均有符號位和數值位兩部分,符號位中0為正,1為負,而數值位三種表示方法各不相同;

原碼:直接將整型按照正負數的形式翻譯成二進位制就可以了;

反碼:將原碼的符號位不變,其他位依次按位取反;

補碼:反碼+1得到補碼;

例如:將int a=20翻譯成二進位制:

00000000000000000000000000010100—原碼

00000000000000000000000000010100—反碼

00000000000000000000000000010100—補碼

翻譯成十六進製制(補碼的每四個二進位制位為1個16進製制位):

0x00000014 (其中0x表明它是乙個十六進製制數)

將int b=-10翻譯成二進位制:

10000000000000000000000000001010—原碼

11111111111111111111111111110101—反碼

11111111111111111111111111110110—補碼

翻譯成十六進製制:

0xfffffff6

對於整形來說,存放在記憶體中的是補碼,原因在於:可以將符號位和數值位統一處理,同時,加法和減法也可以統一處理(cpu只有加法器),此外,補碼和原碼相互轉換,其運算過程是相同的,不需要額外的硬體電路;

如:1-1會被計算機轉化為1+(-1),即1和-1的補碼相加,過程如下:

00000000000000000000000000000001

+111111111111111111111111111111111

得到100000000000000000000000000000000,由於1位於第33位,而int型別只能存放32bit,所以1被丟棄;

從而得到00000000000000000000000000000000,轉化為整型後得到0;

資料的儲存往往涉及大小端儲存模式的問題(pc機器中多為小端儲存模式)

對於機器中大小端儲存模式的判斷,可以採用以下的**形式:

int

check_sys()

intmain()

int

main()

輸出結果是什麼呢?

不妨先自己算一下,然後看後面的詳解;、、

、、、、

、、詳解:-1的補碼為11111111 11111111 11111111 11111111

char型別只讀取記憶體中的第乙個位元組,也就是11111111,而a和b都是有符號char型別,且要以%d的形式輸出,所以對11111111進行整型提公升(在高位處補符號位,補到32位為止)得到11111111 11111111 11111111 11111111,輸出後得到-1;

而c是無符號整型,對11111111進行整型提公升(無符號整型在高位處補0)得到00000000 00000000 00000000 11111111,由於無符號數原反補相同,所以輸出結果為255;

所以最終的答案為::a=-1,b=-1,c=255

詳解資料儲存(上)——進製

詳解資料儲存(下)——浮點型

(乾貨)詳解資料儲存(上) 進製

在計算機中,資料型別分為整型與浮點型兩種型別,而對於這兩種型別的儲存方式又有哪些異同?我將分三章,對計算機的資料儲存進行詳細的介紹 再詳細介紹整型與浮點型的儲存形式之前,先預鋪墊一些二進位制 八進位制 十進位制與十六進製制之間表示與轉換的基礎。r進製轉換為十進位制數採用權值累加的方法 例一 將二進位...

整型資料儲存

1 include int main 1000 0000 0000 0001 1原始碼 1111 1111 1111 1110 1反碼 1111 1111 1111 1111 1補碼 對於a,按位提公升,看的是當前位元位的型別,所以按位提公升將變為1111 1111 1111 1111 1111 1...

堆疊詳解(資料與記憶體中的儲存方式)

char r hello word char b hello word r w b w 其實應該是語法錯誤,可是vc 6.0沒有警告或者錯誤,r指向的是文字常量區,此區域是編譯的時候確定的,並且程式結束的時候自動釋放的,r w 企圖修改文字常量區引起錯誤,b的區別在於其空間是在棧上分配的,因此沒有錯...