>> 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