先看這段代碼 前端
經過指針能夠直接訪問內存,而在C#中這屬於不安全操做,爲了能讓代碼編譯運行所以都要帶上unsafe,這個不用管它。這段代碼主要是藉助單字節數據類型byte,直接訪問內存,查看各類數據類型的數據在內存的存放狀況。在往常認爲整數0,1,2,3,4,5……之類的存放在內存的就是轉換成二進制再放進去;而字符則是先經過字符編碼轉換,好比ASCII碼A,B,C,D轉換成01000001,01000010,01000011再放進去。固然這個層次還不夠細。想當年在大學時代知道這些還算過得去了。直到最近再去看計算機科學之類的書籍才加深了本身對這方面的認知。安全
在學C的時候都有提過無符號數,而咱們一般使用的都是有符號數。在整形而言有符號整形而無符號整形已經是兩套不一樣的編碼:無符號整形是直接把十進制數轉換成二進制;有符號整形須要把數轉換成補碼。補碼原碼反碼之類的在大學裏常常接觸。可是記憶中老師好像沒提到補碼是存無符號整形的,卻是想再翻翻之前的教材裏有沒有提到。因爲整形有short,int,long三種不一樣長度,若是二進制值超出了所存放類型的長度就會把高位捨去,這就形成所謂的數據溢出。有符號和無符號數的區別在於多了個符號,因此補碼是把最高位留着做爲符號位,既然二進制位的長度是定的,因此補碼中表示數據的位數就少了一位,所以有符號數的最大正數會比無符號數的最大整數要小了。這好像扯遠了。 測試
雖然這些數字和字符轉換成0101這樣的二進制編碼後就能存放在內存中,好比無符號整數12345,它轉換成二進制就是0011 0000 0011 1001太長了,爲了方便顯示就轉換成16進製表示30 39,而int類型是4個字節,1個字節8個位。這個值實際只佔了2個字節,剩餘的字節用0來補全,那麼其實是00 00 30 39。在無符號整數123456在內存中是否就以00 00 30 39來存放呢?運行一下代碼 編碼
查看結果 spa
發現恰好跟猜測相反。對於00 00 30 39 這串數據而言,00是高位,39是低位,測試的結果發現數字存放在內存中被高低位互換了。不過也不能妄下定論說數據通過高低位互換才放到內存中,實際上這裏還涉及到字節順序中大端法和小端法的概念。若是一個數據,它存放在內存中的字節順序是從數據的高位一直到低位的,好比上面12345,存放順序是 00 00 30 39。那這種就稱爲大端法,我理解是"大位靠前端法";與之相反,數據存放內存中字節順序從低位到高位存放的,好比上面12345,存放順序是39 30 00 00,這種稱之爲小端法,"小位靠前法"。C語言是移植性很強的語言。C#依靠DotNet Core也能夠實現跨平臺,我卻是沒有在別的平臺上運行過上面的代碼。C語言也沒有,但聽說與上面相似的代碼在Sun,Linux32,Linux64上運行,僅有Sun是顯示00 00 30 39。也就是說只有Sun是使用了大端法來存儲數據,其餘平臺都使用小端法來存儲數據。當咱們在主機與主機與間進行數據交互時,就要注意雙方平臺所用的字節順序。鄙人在使用串口通信時就遇到過這個場景,發送或接收一串數據,其中某幾個字節是有用的數據,把數據取出來以後還須要高低位互換,纔是所須要的數據。這就是一個很好的例子了。 指針