2015-08-20 57 views
0

我想將一個常量聲明爲Word類型的16位整數併爲其分配一個值。爲了支持大端和小端平臺之間的可移植性,我不能安全地使用像這樣的分配:Ada83在聲明中未經檢查的記錄轉換

Special_Value : Constant Word := 16#1234#; 

因爲字節順序可能被誤解。

所以我使用了一個記錄是這樣的:

Type Double_Byte Is Record 
     Byte_1 : Byte; -- most significant byte 
     Byte_0 : Byte; -- least significant byte 
    End Record; 
    For Double_Byte Use Record 
     Byte_1 At 0 Range 0..7; 
     Byte_0 At 0 Range 8..15; 
    End Record; 

然而,在某些情況下,我有大量的預配置任務的看起來像這樣:

Value_1 : Constant Word := 15#1234#; 

這是非常一個人可讀,但endian問題導致它被誤解了許多方法(例如在調試器中)。

因爲我有很多行,我這樣做,我嘗試了以下,因爲它是相當緊湊的源代碼。這是工作,但我不知道爲什麼,或者是什麼的Ada參考手冊的部分涵蓋這一概念:

Value_1 : Constant Word := DByte_To_Word((Byte_1 => 16#12#, 
              Byte_0 => 16#34#)); 

其中DByte_To_Word被定義爲

Function DByte_To_Word   Is New Unchecked_Conversion(Double_Byte, Word); 

我想我已經看到一些在ARM允許我這樣做,但不是我上面描述的方式。我找不到它,我不知道我會尋找什麼。

回答

1

您打電話給DByte_To_Word沒有什麼不尋常的; (Byte_1 => 16#12#, Byte_0 => 16#34#)Double_Byte類型的完全合法的記錄彙總,請參閱LRM83 4.3.1

但是!但!確實,在一個big-endian機器上,Word的第一個(最低地址)字節將包含16#12#,而在小端機器上它將包含16#34#。 CPU負責所有這些;如果您打印Special_Value的值,則無論計算機實現哪種字節順序,您都將獲得16#1234#(或0x1234)。

只有當您將二進制數據從一個endianness複製到另一個,通過網絡或文件時,纔會遇到endianness問題。

如果您的調試器對此感到困惑,您需要一個更好的調試器!