byte + byte = int: why?
jfondren
julian.fondren at gmail.com
Sun Aug 29 16:21:40 UTC 2021
On Sunday, 29 August 2021 at 15:57:18 UTC, Paul Backus wrote:
> On Sunday, 29 August 2021 at 15:42:18 UTC, Ali Çehreli wrote:
>> Depending on the situation, you may want to use std.conv.to,
>> which does a value range check and throws an exception to
>> prevent an error:
>>
>> byte foo(byte a, byte b) {
>> import std.conv : to;
>> return (a + b).to!byte;
>> }
>>
>> void main() {
>> foo(42, 42); // Works
>> foo(100, 100); // Throws ConvOverflowException
>> }
>
> I was going to suggest `std.experimental.checkedint` as an
> alternative here, but it turns out that it does integer
> promotion too--`Checked!byte + Checked!byte == Checked!int`.
>
> This seems obviously wrong to me, but according to run.dlang.io
> it's always worked that way.
(a.checked + b).get is int, but this works:
```d
import std.experimental.checkedint;
byte foo(byte a, byte b) {
auto c = a.checked;
c += b;
return c.get;
}
unittest {
import std.exception : assertThrown;
import core.exception : AssertError;
foo(42, 42);
assertThrown!AssertError(foo(100, 100));
}
```
... after Phobos is patched.
```
error: undefined identifier ‘Lhs’, did you mean alias ‘Rhs’?
```
More information about the Digitalmars-d-learn
mailing list