A negative number (-A5) is the twos compliment of the positive number.  A
ones compliment is all the bits flipped.  A twos compliment is a ones
compliment plus one.  So a ones compliment of (A5) is (-A5 - 1), which is
-A6.

So presumably, the twos compliment operator is (-). And I suppose for
consistency, +-A5 gives you -A5, which makes +- the twos compliment bitwise
operator..

On Tue, Jan 14, 2020 at 7:45 AM Paul Procacci <pproca...@gmail.com> wrote:

> >> What is the syntax for a twos complement anyway?
>
> I'm not sure I understand the question.
> Two's compliment is +^ ... the routine you've been using.
>
> On Tue, Jan 14, 2020 at 12:33 AM ToddAndMargo via perl6-users <
> perl6-us...@perl.org> wrote:
>
>> >> On Mon, Jan 13, 2020 at 11:30 PM ToddAndMargo via perl6-users
>> >> <perl6-us...@perl.org <mailto:perl6-us...@perl.org>> wrote:
>> >>
>> >>     Hi All,
>> >>
>> >>     This works,
>> >>
>> >>          $ p6 'my uint8 $c = 0xA5; my uint8 $d =  +^$c; say
>> $d.base(16);'
>> >>          5A
>> >>
>> >>     But this does not:
>> >>
>> >>          $ p6 'my uint8 $c = 0xA5; say (+^$c).base(16);'
>> >>          -A6
>> >>
>> >>     1) who turned it into an negative integer?
>> >>
>> >>     2) how do I turn it back?
>> >>
>> >>     Many thanks,
>> >>     -T
>>
>> On 2020-01-13 21:18, Paul Procacci wrote:
>> > If you read the signature for +^, you'll notice it returns an Int.
>> >
>> > In your first working example, you're taking a uint8 with binary value
>> > 10100101, zero extending it to 64 bits via +^, applying a two's
>> > compliment, and then assigning bits [0:7] to another uint8 which at
>> that
>> > point contains the binary value of 01011010 (or hex value 0x5A).
>> > In your second example that isn't working, you're taking uint8 with
>> > binary value 10100101, zero extending it to 64 bits via +^, applying a
>> > two's compliment, and then displaying this *Int* (64 bits) as hex.[1]
>> > To turn it back you need to mask off bits [8:63] with: say ((+^$e) +&
>> > 0x0FF).base(16);" [2]
>> >
>> > [1] I'd show you the 64 bit value but it's a bunch of 1's followed by
>> > the value -0xA6.
>> > [2] Note, since the type has been promoted to an Int there' no going
>> > back to uint8 without an explicit assignment (afaik)
>> >
>>
>> That explains it.  Thank you.
>>
>> I used uint8 to keep the ones to a mild torrent!
>>
>> If I am remembering correctly, 0xA5 going to 0x5A is
>> a ones compliment.
>>
>> What is the syntax for a twos complement anyway?
>
>
>>
>
> --
> __________________
>
> :(){ :|:& };:
>

Reply via email to