跳轉到內容

Ada 程式設計/型別/mod

來自華夏公益教科書,開放的書籍,開放的世界

Ada. Time-tested, safe and secure.
Ada. 經久耐用,安全可靠。


Ada 中的無符號整數的值範圍從 0 到某個正數(不一定是 2 的冪減 1)。它們使用mod 關鍵字定義,因為它們實現了迴圈算術。

 mod Modulus

其中 'First 為 0,而 'Last 為 Modulus - 1。

迴圈算術意味著 'Last + 1 = 0 = 'First,以及 'First - 1 = 'Last。除了正常的算術運算子之外,按位, orxor 也為該型別定義(見下文)。

預定義包 Interfaces (RM B.2 [帶註釋的]) 提供了基於 2 的冪的無符號整數

type Unsigned_n is mod 2**n;

它也為其定義了移位和旋轉操作。n 的值取決於編譯器和目標架構。

您可以使用range 來對模型別進行子範圍化

type Byte is mod 256;
subtype Half_Byte is Byte range 0 .. 127;

但要注意:Half_Byte 的 Modulus 仍然是 256!對這種型別的算術運算至少可以說很有趣。

按位運算

[編輯 | 編輯原始碼]

對按位運算子要非常小心, , 異或, not,當模數不是 2 的冪時。一個例子可以說明這個問題。

type Unsigned is mod 2**5;   -- modulus 32
X: Unsigned := 2#10110#;     -- 22
not X        = 2#01001#      -- bit reversal: 9 ( = 31 - 22 ) as expected

其他運算子的工作方式類似。

現在取一個不是 2 的冪的模數。對結果的樸素期望可能會導致超出值範圍。例如,再次取not 運算子(有關其他運算子,請參見 RM)

type Unsigned is mod 5;
X: Unsigned := 2#001#;  -- 1, bit reversal: 2#110# = 6 leads out of range

的定義not 因此為

 not X = Unsigned'Last – X  -- here: 4 – 1 = 2#011#

另請參閱

[編輯 | 編輯原始碼]

華夏公益教科書

[編輯 | 編輯原始碼]

Ada 參考手冊

[編輯 | 編輯原始碼]


華夏公益教科書