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
