Jeremie Pelletier wrote:
Don wrote:
Saaa wrote:
Jeremie Pelletier wrote
Saaa wrote:
I think is very bug-prone, isn't it obvious iub should be -5?
ubyte ub = 5;
int iub = -ub; // iub now is 251
What is the reasoning to do it this way?
Minus toggles the most significant bit, be it on a signed or
unsigned type. When converting it to an int, the byte being signed
or unsigned does make a difference: when unsigned the number is
copied as is, when signed the most significant bit (bit 7) is
shifted to the most significant bit of the int (bit 31).
Its therefore pretty standard logic, no warning is given since the
entire ubyte range fits within an int
Jeremie
Thanks, but it is not that I do not know how it occurs more that
I should have asked whether people use this kind of logic.
For me it resulted in annoying bug like this:
for(int i = nloop;i<10;i++);//ubyte nloop is created quite a few
lines above.
This has been discussed before, and it really should be an error.
It's reasonable to implicitly cast between integral types of different
size, and also signed<->unsigned, but performing both within the same
expression is almost always a bug. It should not be possible without
an explicit cast.
I know VC++ shouts a warning everytime signed and unsigned integrals are
mixed, maybe that's the road D should take too.
We can do *much* better than that.
About two releases ago D2 got integer range tracking, so you can do
things like:
long a = someCrazyFunction();
ubyte b = (a & 7) | 0x60; // No worries! This is perfectly fine!
ubyte c = a; // Error, might overflow.
It just needs to be extended a bit more. It's far from finished.