2013-02-01 37 views
1

我有一個ISA,它是小端的「種」。 基本存儲器單元是一個整數,而不是byte.For例如編譯器和endians

00000000: BEFC03FF 00008000 

表示一個「低」是整數BEFC03FF和「高」是整數00008000。 我需要讀取由某些位表示的值。例如31到47位。 我在VS10(C++)中執行的操作在使用相關掩碼並檢查var & mask的值後生成uint64_t var = 0x00008000BEFC03FF 。 這樣做是否合法?我對uint64_t位安排做了一些假設 - 它是否合法? 我可以假設,對於非常編譯器和每個操作系統(不依賴於hw),uint64_t中位的排列方式是這樣嗎?

+1

什麼你真的需要做什麼?是否需要讀/寫特定的內存地址,或執行其他形式的I/O?如果不是,那麼你不必擔心排序。 –

+0

@OliCharlesworth - 我沒有寫我想做的事情嗎?如果它不是I/O - 爲什麼我不需要擔心字節順序?我想了解這個概念以及它是否依賴於編譯器 – Yakov

+0

像'uint64_t var = 0x00008000BEFC03FF; var&mask'不依賴於字節順序。只有當你關心底層表示時,字節順序才重要(這就是爲什麼它對IO很重要)。 –

回答

1

你是對的關注,它確實事。但是,在這種特殊情況下,由於ISA是小端,也就是說如果它有AD [31:0],整數的最低有效位打包到位0.假設你的處理器也是小端,那麼完全不用擔心。當數據寫入內存,它應該有正確的字節順序

0000 FF 
0001 03 
0002 .. 

假設,如果你的外部總線協議是big endian和您的處理器是小端。那麼你的處理器中的一個16位整數,例如0x1234將是原生格式的0001_0010_0011_0100,但總線上的0010_1100_0100_1000(假設它是16位)。

在這種情況下,多字節數據越過端邊界,硬件將交換一個字節內部位,因爲它必須保持字節之間的存儲器contiguousness。經過硬件交換,就變成:

0000 0001_0010 
0001 0011_0100 

那麼它是由軟件來交換字節順序