在c中,我有點擔心endianess的概念。假設我聲明一個小端機器上的整數(2個字節)作爲endianess和整數變量
int a = 1;
並且它被存儲爲:
Address value
1000 1
1001 0
在大端它應該被存儲爲反之亦然。現在,如果我做& a,那麼我應該在兩臺機器上都打開1000。
如果這是真的,那麼如果我存儲int a=1
那麼我應該得到a = 1的小端,而2^15的大端。它是否正確?
在c中,我有點擔心endianess的概念。假設我聲明一個小端機器上的整數(2個字節)作爲endianess和整數變量
int a = 1;
並且它被存儲爲:
Address value
1000 1
1001 0
在大端它應該被存儲爲反之亦然。現在,如果我做& a,那麼我應該在兩臺機器上都打開1000。
如果這是真的,那麼如果我存儲int a=1
那麼我應該得到a = 1的小端,而2^15的大端。它是否正確?
只要您不在平臺之間傳輸數據(或通過彙編代碼訪問數據),數據如何表示並不重要。
如果你只使用標準C--它對你來說是隱藏的,你不應該打擾你自己。如果您在未知機器之間傳遞數據(例如,您有一個客戶端和一個通過某個網絡進行通信的服務器應用程序) - 使用hton
和ntoh
函數可以將本地網絡轉換爲網絡,並且可以從網絡轉換爲本地永久性,從而避免出現問題。
如果你直接訪問內存,那麼問題不僅是endian,而且還包裝,所以要小心。
在小端和大端都會返回「第一個」字節的地址。這裏的「第一」在你的例子中是指1000,而不是在最重要或最不重要的字節意義上的「第一」。
這是正確的,但它不僅是c中的一個問題,而且還包括讀取和寫入二進制數據的任何程序。如果數據停留在一臺計算機上,那就沒問題。
另外,如果你正在讀/寫文本文件,這不會是一個問題。現在
如果我這樣做
&a
那麼我應該對大端小端和1001獲得1000。
否;在兩臺機器上,你將得到地址1000.
如果這是真的,那麼如果我存儲int a = 1那麼我應該得到a = 1在小端,而2^15在大端。它是否正確?
否;因爲初步條件是錯誤的。另外,如果將1賦給一個變量,然後再讀取該值,則返回結果1。其他任何事情都會成爲混亂的主要原因。 (有些情況下(讀回存儲值)不能保證 - 例如,如果多個線程可以修改變量,或者它是嵌入式系統上的I/O寄存器。但是,您會意識到如果你需要了解它的話)。
大多數情況下,你不需要擔心字節順序。有幾個地方你做。套接字聯網功能就是這樣的;將二進制數據寫入將在不同字節順序的機器之間傳輸的文件是另一種方法。幾乎所有其餘的時間,你不必擔心它。
所以我真的,我會得到a = 1的小端和a = 2^15的大端.. – 2011-04-13 05:42:10
@prp:不,你可能不會得到1和2^15。如果您的大型機器讀取代表寫入小型機器上的0x0001的兩個字節的數據,或者如果您在小型機器上讀取寫在大型機器上的數據,您可能會得到0x0100十六進制值。 – 2011-04-13 06:38:41
無關規則的兩個例外:1)任何「互聯網」(如IP地址)都是兩個小端機器之間的「網絡字節順序」(大端)。使用適當的包裝函數隱藏了這些實現細節,並全部避免了這個問題(閱讀文檔!)。 2)SSE內在因素。如果你沒有閱讀_carefully_,看起來寫C代碼時,即使在同一臺機器上,其中一些可能會咬你。這是因爲,例如在'_mm_set_ps'中,英特爾選擇了以大多數「正常思維」人所期望的方式排列參數。 – Damon 2011-04-13 08:29:07