Wyrażenia arytmetyczne
Operatory arytmetyczne są dodawanie (+
), odejmowanie (-
), mnożenie (*
), dzielenie (/
), negacja (-
) i wykładnik (^
). Można je stosować do operandów typu Int
, BigInt
lub Double
. Ponadto w przypadku typów całkowitych (Int
i BigInt
) dostępny jest operator obliczeniowy modulus (%
).
W przypadku operatorów binarnych typ obu operandów musi być zgodny, z wyjątkiem wykładnika; wykładnik wartości typu BigInt
musi być typu Int
. Typ całego wyrażenia jest zgodny z typem lewego operandu. W przypadku wykładnika Int
i BitInt
zachowanie jest niezdefiniowane, jeśli wykładnik jest ujemny lub wymaga więcej niż 32 bitów do reprezentowania (czyli jeśli jest większy niż 2147483647).
Dzielenie i modulo wartości typu Int
i BigInt
są zgodne z następującym zachowaniem dla liczb ujemnych:
A |
B |
A / B |
A % B |
---|---|---|---|
5 | 2 | 2 | 1 |
5 | -2 | -2 | 1 |
-5 | 2 | -2 | -1 |
-5 | -2 | 2 | -1 |
Oznacza to, że a % b
zawsze ma ten sam znak co a
, a b * (a / b) + a % b
zawsze równa się a
.
Q# nie obsługuje automatycznych konwersji między typami danych arytmetycznych ani żadnymi innymi typami danych. Jest to ważne szczególnie w przypadku Result
typu danych i ułatwia ograniczenie sposobu propagacji informacji środowiska uruchomieniowego. Ma to korzyść z unikania przypadkowych błędów, takich jak te związane z utratą precyzji.