digitalmars.D.learn - Prefer Signed or Unsigned in D?
- John Carter (4/4) Sep 01 2015 C/C++ discussion here....
- BBasile (18/22) Sep 02 2015 It depends on the context.
- Dominikus Dittes Scherkl (15/40) Sep 02 2015 I wish the following would be the standard D behaviour (for T ==
- ponce (3/7) Sep 02 2015 Everything Bjarne said still applies equally to D code, since
- John Carter (19/29) Sep 02 2015 Hmm. What Robert Elder says also applies still. And in my world
- ponce (6/12) Sep 02 2015 I'd like to point out that while Robert Elder has remarkably
- John Carter (5/10) Sep 02 2015 Interesting.. The reference is fairly terse on exactly what
C/C++ discussion here.... http://blog.robertelder.org/signed-or-unsigned-part-2/ D rules here... http://dlang.org/type.html#integer-promotions
Sep 01 2015
On Tuesday, 1 September 2015 at 23:06:50 UTC, John Carter wrote:C/C++ discussion here.... http://blog.robertelder.org/signed-or-unsigned-part-2/ D rules here... http://dlang.org/type.html#integer-promotionsIt depends on the context. You should take care of blending signed and unsigned: comparison error, a is > b but... --- uint a = 1; int b = -1; assert(a < b); // does not throw --- You should take care to the index type in a loop: loop that doesn't run at all because of an infered unsigned index... --- auto array = new int[](8); for (auto i = array.length - 1; i > -1; i--) array[i] = 8; assert(array[0] == 0); // does not throw ---
Sep 02 2015
On Wednesday, 2 September 2015 at 09:47:16 UTC, BBasile wrote:On Tuesday, 1 September 2015 at 23:06:50 UTC, John Carter wrote:I wish the following would be the standard D behaviour (for T == U or if floats are involved neither C nor D have a problem)): int opCmp(T, U)(const(T) a, const(U) b) pure safe nogc nothrow if(isIntegral!T && isIntegral!U && !is(Unqual!T == Unqual!U)) { alias C = CommonType!(T, U); static if(isSigned!T && isUnsigned!U && T.sizeof <= U.sizeof) return (a < 0) ? -1 : opCmp(cast(U)a, b); else static if(isUnsigned!T && isSigned!U && T.sizeof >= U.sizeof) return (b < 0) ? 1 : opCmp(a, cast(T)b); else return opCmp(cast(C)a, cast(C)b); } this is really almost equally fast, but always correct.C/C++ discussion here.... http://blog.robertelder.org/signed-or-unsigned-part-2/ D rules here... http://dlang.org/type.html#integer-promotionsIt depends on the context. You should take care of blending signed and unsigned: comparison error, a is > b but... --- uint a = 1; int b = -1; assert(a < b); // does not throw --- You should take care to the index type in a loop: loop that doesn't run at all because of an infered unsigned index... --- auto array = new int[](8); for (auto i = array.length - 1; i > -1; i--) array[i] = 8; assert(array[0] == 0); // does not throw ---
Sep 02 2015
On Tuesday, 1 September 2015 at 23:06:50 UTC, John Carter wrote:C/C++ discussion here.... http://blog.robertelder.org/signed-or-unsigned-part-2/ D rules here... http://dlang.org/type.html#integer-promotionsEverything Bjarne said still applies equally to D code, since integer promotion is identical with C from what I understand.
Sep 02 2015
On Wednesday, 2 September 2015 at 11:03:00 UTC, ponce wrote:On Tuesday, 1 September 2015 at 23:06:50 UTC, John Carter wrote:Hmm. What Robert Elder says also applies still. And in my world his argument about undefined behavior carries weight. Bugs that emerge from different optimizations / different versions of the compiler / on different CPU's are nightmares in my domain. Here is a bug that existed in the JDK for 9 years (and probably in many other places....) http://googleresearch.blogspot.co.nz/2006/06/extra-extra-read-all-about-it-nearly.html So given the advice on mixing unsigned and signed, and the complexity of Dominikus's code to get signed and unsigned code to compare sanely.... Maybe if his code becomes standard in D... Yup, mixing signed and unsigned is A Bad Thing, and you best go with whatever your base libraries give you. The whole problem.... http://www.di.unipi.it/~ruggieri/Papers/semisum.pdf ...makes me feel vaguely ill and long for a Numerical Tower. I really must get around to benchmarking BigInt....C/C++ discussion here.... http://blog.robertelder.org/signed-or-unsigned-part-2/ D rules here... http://dlang.org/type.html#integer-promotionsEverything Bjarne said still applies equally to D code, since integer promotion is identical with C from what I understand.
Sep 02 2015
On Wednesday, 2 September 2015 at 21:22:59 UTC, John Carter wrote:On Wednesday, 2 September 2015 at 11:03:00 UTC, ponce wrote:I'd like to point out that while Robert Elder has remarkably documented articles, his conclusions are still contrary to most C++ experts (Bjarne, Meyers, Andrei...). Additionally, I was said weeks ago on this NG that and signed overflow in D is not actually Undefined Behaviour.Everything Bjarne said still applies equally to D code, since integer promotion is identical with C from what I understand.Hmm. What Robert Elder says also applies still. And in my world his argument about undefined behavior carries weight.
Sep 02 2015
On Wednesday, 2 September 2015 at 21:43:17 UTC, ponce wrote:Additionally, I was said weeks ago on this NG that and signed overflow in D is not actually Undefined Behaviour.Interesting.. The reference is fairly terse on exactly what happens, is it more formally specified anywhere? In which case Elder's objection melts away for D and becomes explicitly "prefer signed for D, but don't mix".For integral operands, the *, /, and % correspond to multiply, divide, and modulus operations. For multiply, overflows are ignored and simply chopped to fit into the integral type.
Sep 02 2015