> On 06 Feb 2015, at 18:03, Ben Coman <[email protected]> wrote: > > > > On Fri, Feb 6, 2015 at 10:48 PM, Sven Van Caekenberghe <[email protected]> wrote: > Alejandro, > > > On 06 Feb 2015, at 15:10, Alejandro Infante <[email protected]> > > wrote: > > > > Hello, > > I have just found that calling asByteArray for any negative small integer > > returns the same result that the positive small integer. Is it supposed to > > be like that or is it a bug? > > > > 1 asByteArray = -1 asByteArray. "true" > > > > (1 to: 100000) allSatisfy: [ :int | int asByteArray = int negated > > asByteArray ] “true" > > > > Cheers, > > Alejandro > > (These kinds of questions should be asked on [email protected]) > > You can only represent positive numbers as ByteArrays, because to represent > negative numbers you have to decide how to do that. The most common solution > is to use 2-complement. To do this you also need to decide on the number of > bytes to use. > > Here is an example using 4 bytes: > > | integer size mask | > integer := -123. > size := 4. > mask := (2 raisedTo: size * 8) - 1. > (mask bitAnd: ((integer abs bitXor: mask) + 1)) > asByteArrayOfSize: 4. > > => #[255 255 255 133] > > => FF FF FF 85 > > The reverse is: > > | integer size mask | > integer := #[255 255 255 133] asInteger. > size := 4. > mask := (2 raisedTo: size * 8) - 1. > (mask bitAnd: ((integer abs bitXor: mask) + 1)) > negated > > This is for negative numbers. > > Positive numbers need not be 2-complemented. > > When decoding, integers < (2 raisedTo: (size * 8) - 1) are negative. > > HTH, > > Sven > > > > > I was going to complain about expecting such niceties as a built in > 2s-complement rather than program it myself (I am a bit rusty on such > matters), but when I look what should I find? > > (-123 asTwosComplement: 16rFFFFFFFF) asByteArray. "=> #[255 255 255 133]" > > cheers -ben
That is nice indeed, I didn't that existed. Very handy. I don't like that there are no tests ;-)
