1. 程式人生 > >int型別資料在計算機中的儲存

int型別資料在計算機中的儲存

  首先在這裡給大家先介紹一下原碼、反碼、補碼。最早剛開始學c語言的時候,就是介紹原反補這三種碼,當時感覺為什麼要就弄這麼複雜的三種碼,但是最近了解到了一些計算機內部二進位制的運算之後,感覺自己能夠理解了一些。先簡單的說一下這三種都是什麼,原碼就是將你的十進位制數字轉換成一個32位二進位制數之後的數字序列,反碼就是在原碼的基礎之上,符號位不變其他為進行取反,取反就是如果原碼是1那麼反碼就是0如果原碼是0反碼就是1,補碼就是將你得到的反碼進行加1,之後得到的序列就是你的補碼。在計算機中所有的整型資料都是用補碼來進行儲存的,這樣大大方便了整型資料的計算。原因在於使用補碼,可以將符號位和數值域統一處理,同時,加法和減法也可以統一處理(

CPU中只有加法電路)並且,補碼與原碼的相互轉換,運算過程其實是相同的,不會再需要額外的硬體電路。

  那我們來具體的看一下,整型資料在記憶體中是如何儲存的

 

 先在監視中新增a然後獲取a的地址之後去記憶體下看看a的地址存的是什麼

 

這裡a存的是14 00 00 00

 

之後用同樣的方法獲得b記憶體儲的地址

大家先想一下 如果20變成32位之後是什麼

原碼:0000 0000 0000 0000 0000 0000 0001 0100

反碼:0000 0000 0000 0000 0000 0000 0001 0100

補碼:0000 0000 0000 0000 0000 0000 0001 0100

因為20是一個正數所以他在記憶體中的原碼、反碼、補碼是相同的 在記憶體顯示中四個二進位制變成了一個數字,這列數字就變成了00 00 00 14但是你發現這裡顯示的和你求出出來的正好反了過來,我們再看看負數的是什麼樣。

-10的三種碼

原碼:1000 0000 0000 0000 0000 0000 0000 1010

反碼:1111 1111 1111 1111 1111 1111 1111 0101

補碼:1111 1111 1111 1111 1111 1111 1111 1010

因為四個二進位制位最大的是全是1的情況他如果用十進位制顯示出來就是1+2+4+8=15 不能用一個十進位制數顯示出來,那就得用十六進位制,所以1111 在記憶體中是f 所以-10 的應該是    ff ff ff fe  但是觀察你得出來的結果,同樣也是將你的結果反了過來,那這是為什麼呢?

  這就要對一個新概念進行介紹那就是大小端:大端儲存模式,是指資料的低位儲存在記憶體的高地址之中,而資料的高位儲存在記憶體的低地址之中,小端的儲存模式自然就是,資料的低位儲存在記憶體的低地址中,而資料的高位儲存在記憶體的高地址中。

  那為什麼會有著大小端模式之分呢?這是因為在計算機系統中,我們以位元組為單位,每個地址單元都對應著一個位元組,一個位元組為8bit。但是在C語言彙總除了8bitchar之外還有16bitshor型,還有32bitlong型,由於暫存器的寬度大一一個位元組,那麼必然存在著一個如果將多個位元組安排的問題,因此就導致了大端儲存和小端儲存模式。其實在我看來就是工程師們的意見沒有達成統一所以出現了不同的儲存方式。並沒有什麼實際上的差異吧。

  2015年的百度的系統工程師的面試題中曾經有一道題,請簡述大小端字序的概念,並編寫一個小程式來驗證機器是大端儲存還是小端。

int main()
{
	int i = 1;
	int ret = i >> 8;
	if (ret== 0)
		printf("小端儲存");
	else
		printf("大端儲存");
	return 0;
}


 這是我所編寫的一個程式,如果1是小端儲存的話那麼0000 0001 這最後一個1就在低地址位,在右移的時候就會丟失,那麼補全0之後得出來的數字就是0.如果要是大端儲存的話1000 0000  這個1就在最前邊,如果你右移8位的時候就不會丟失這個1,得出來就不是1。所以能判段是大端還是小端。

#include<stdio.h>

int check()

{

int i = 1;

return (*(char*)&i);

}

int main()

{

int ret = check();

if (ret == 1)

printf("小端儲存");

else

printf("大端儲存");

return 0;

}

return (*(char*)&i)這裡的意思將你的整型資料i取地址之後將整型強轉成char型別來進行訪問因為int型別是32位但是char型別只有8位所以如果你的機器是小端儲存的話你轉化成char型別之後依然是1,但是如果你用大端儲存的話轉化之後你的1就丟失了。所以這種辦法也能判斷是大端儲存還是小端儲存。

  網上看到一句話,咱們用的機器大多都是小端儲存如果你面試的時候編寫程式出現了大端儲存的情況就要好好檢查一下,但是也不排除真的是大端儲存的情況。

網上還有一個union的方法,沒有過多的瞭解過union所以就先不對這種放大進行介紹了,等哪天搞清楚了再給大家介紹。