2015-04-01 27 views
0

比方說,我在Ada的創建類型:在Ada中如何將比特排列在縮小範圍變量中?

type Coord_Type is range -32 .. 31; 

我能想到位,發送該值到另一個系統時,看起來像在內存中,或特別?

我可以考慮兩種選擇。

其中之一是全部(默認整數?)空間用於「Coord_Type」的所有變量,但只有該範圍內的值是可能的。如果我假設二進制補碼,然後,值25和-25將是可能的,但不是50或-50:

0000 0000 0001 1001 (25) 
1111 1111 1110 0111 (-25) 
0000 0010 0011 0010 (50) X Not allowed 
1111 1111 1100 1110 (-50) X Not allowed 

另一種選擇是,空間被壓縮到只需要什麼。 (我選擇了一個字節,但也許甚至只有6位?)因此,與上述值,該位可能被安排爲這樣:

0000 0000 0001 1001 (25) 
0000 0000 1110 0111 (-25) 
0000 0000 0011 0010 (50) X Not allowed 
0000 0000 1100 1110 (-50) X Not allowed 

從本質上講,它阿達進一步影響值的存儲超出限制什麼範圍允許在一個可變的空間?這個問題,Endianness和2s補充甚至被Ada控制?

+3

如果你只是做了上面的事情,你可以把它留給編譯器。如果32位整數最快,那可能就是你所得到的(而超出範圍的值會引發一個異常,指向接近錯誤的地方......)如果你需要控制表示,看看「pragma Pack」 ,「屬性大小」或Ada-2012方面條款等。如果必須,您可以在6位邊界上指定這些數組。編譯器將服從或報告極端包裝不受支持。希望有人會給出詳細的答案。同時,您可以在Ada RM中搜索這些內容並開始... – 2015-04-02 00:14:10

+3

對,Ada沒有指定數字是如何表示的,雖然它提供了一些方面,屬性和編譯指示來幫助您控制這些,並且各個編譯器可能會提供其他。 Ada並不要求這些數字以二進制補碼形式存儲,儘管如今很難找到一臺沒有的計算機。我曾經在一些只使用十進制數的Burroughs主機上工作 - 沒有二進制算術指令。 (他們是面向COBOL的。)我懷疑Ada是否曾在任何這些野獸中實現過。 – ajb 2015-04-02 06:33:29

+0

這正是我需要知道的:「編譯指示包」和編譯器是要搜索位分配答案的區域。謝謝。 – 2015-04-02 15:45:54

回答

0

當你聲明這樣的類型時,你可以讓編譯器爲每個體系結構選擇最佳佈局。在某些體系結構中,甚至可能得到二進制編碼的十進制(BCD)而不是二進制補碼。