digitalmars.D.learn - Inferring an integer literal as ubyte
- Shriramana Sharma (11/11) Dec 14 2015 Hello. I was trying to do something like this:
- Kagamin (2/2) Dec 14 2015 They are promoted to int in arithmetic operations unless compiler
- Adam D. Ruppe (11/12) Dec 14 2015 That's not an integer literal... that's a runtime value of ubyte
- Shriramana Sharma (4/5) Dec 14 2015 Thanks for that explanation. That's clear now.
Hello. I was trying to do something like this: ubyte code = to!ubyte(spec, 6) + 16; and got an error saying: cannot implicitly convert expression (cast(int)to(spec, 6) + 16) of type int to ubyte Looking at http://dlang.org/spec/lex.html#IntegerLiteral, sure enough 16 is specified to be inferred as an `int`. I thought that integer literals used to be inferred as the smallest integral type that can fit them – am I mistaken? --
Dec 14 2015
They are promoted to int in arithmetic operations unless compiler can prove the value doesn't exceed its range.
Dec 14 2015
On Monday, 14 December 2015 at 13:33:41 UTC, Shriramana Sharma wrote:ubyte code = to!ubyte(spec, 6) + 16;That's not an integer literal... that's a runtime value of ubyte plus an integer literal. Since the ubyte is the result of a runtime function, the compiler doesn't know what it will be and thinks it could be anything from 0 to 255, inclusive. 240 + 16 = 256 = too big to fit in a ubyte, to it requires a cast. ubyte code = 16; // this would work ubyte code = 239 + 16; // this too but yours won't because to!ubyte(spec, 6) might just be > 240.
Dec 14 2015
Adam D. Ruppe wrote:but yours won't because to!ubyte(spec, 6) might just be > 240.Thanks for that explanation. That's clear now. --
Dec 14 2015