Providing implicit conversion of
Danilo
codedan at aol.com
Mon Jan 22 07:01:11 UTC 2024
On Sunday, 21 January 2024 at 16:05:40 UTC, Gavin Gray wrote:
> The following code:
>
> ulong charlie = 11;
> long johnstone = std.algorithm.comparison.max(0, -charlie);
> writeln(format!"johnstone %s"(johnstone));
>
> Results in (without any warning(s)):
> johnstone -11
>
> However you choose to look at it, this means -11 > 0
> (regardless of all arguments concerning implicit conversions,
> 1's and 2's complements, being efficient, etc).
>
> The language should not allow unary unsigned anything.
This returns -1:
```d
import std;
void main() {
ulong charlie = 11;
long johnstone = std.algorithm.comparison.max(0, -charlie);
writeln(format!"johnstone %s"(johnstone));
}
```
If you change the result type to `auto johnstone`, it returns
18446744073709551605:
```d
module app;
import std;
void main() {
ulong charlie = 11;
auto johnstone = std.algorithm.comparison.max(0, -charlie);
writeln(format!"johnstone %s"(johnstone));
}
```
So what happens is, max() correctly returns 18446744073709551605,
but if you explicitely receive a `long`, the `ulong` is converted
to a long,
resulting in -11.
With `auto johnstone` or `ulong johnstone` the result is correct:
```d
import std;
void main() {
ulong charlie = 11;
ulong johnstone = std.algorithm.comparison.max(0, -charlie);
writeln(format!"johnstone %s"(johnstone));
}
```
If you take a bigger type, like `Int128`, it is also correct:
```d
import std;
void main() {
ulong charlie = 11;
Int128 johnstone = std.algorithm.comparison.max(0, -charlie);
writeln(format!"johnstone %s"(johnstone));
}
```
More information about the Digitalmars-d-learn
mailing list