Ada 程式設計/型別/mod
外觀
Ada 中的無符號整數的值範圍從 0 到某個正數(不一定是 2 的冪減 1)。它們使用mod 關鍵字定義,因為它們實現了迴圈算術。
mod Modulus
其中 'First 為 0,而 'Last 為 Modulus - 1。
迴圈算術意味著 'Last + 1 = 0 = 'First,以及 'First - 1 = 'Last。除了正常的算術運算子之外,按位和, or 和xor 也為該型別定義(見下文)。
預定義包 Interfaces (RM B.2 [帶註釋的]) 提供了基於 2 的冪的無符號整數
typeUnsigned_nismod2**n;
它也為其定義了移位和旋轉操作。n 的值取決於編譯器和目標架構。
您可以使用range 來對模型別進行子範圍化
typeByteismod256;subtypeHalf_ByteisByterange0 .. 127;
但要注意:Half_Byte 的 Modulus 仍然是 256!對這種型別的算術運算至少可以說很有趣。
對按位運算子要非常小心和, 或, 異或, not,當模數不是 2 的冪時。一個例子可以說明這個問題。
typeUnsignedismod2**5; -- modulus 32 X: Unsigned := 2#10110#; -- 22notX = 2#01001# -- bit reversal: 9 ( = 31 - 22 ) as expected
其他運算子的工作方式類似。
現在取一個不是 2 的冪的模數。對結果的樸素期望可能會導致超出值範圍。例如,再次取not 運算子(有關其他運算子,請參見 RM)
typeUnsignedismod5; 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#
- 4.4: 表示式 [帶註釋的]
- 3.5.4: 整數型別 [帶註釋的]
