Alejandro,
(These kinds of questions should be asked on pharo-users@lists.pharo.org)
> On 06 Feb 2015, at 15:10, Alejandro Infante <alejandroinfante91@gmail.com> 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
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