# Perl function for negative integers using the 2's complement in hex?

#### Do you have a question? Post it now! No Registration Necessary.  Now with pictures!

•  Subject
• Author
• Posted on

I cannot seem to find a Perl function that will return the 2's
complement of a negative integer represented in hex.
For example:
ffbe8e should return  -16754, not 16760462

hex() works fine for positive integers but not here
pack/unpack don't seem to want to produce anything negative (just 0)

I imagine that there is a 'brute force' method, but it seems that there
should be an eloquent function that speaks in 2's complement . . . .

Thanks,
Liam

## Re: Perl function for negative integers using the 2's complementin hex?

stylechief wrote:
> I cannot seem to find a Perl function that will return the 2's
> complement of a negative integer represented in hex.
> For example:
> ffbe8e should return  -16754, not 16760462

You have to remember that 32-bit integers are represented by
eight hex digits, not six.

linux% perl -le 'printf "%d %d\n",0xffbe8e,0xffffbe8e'
16760462 -16754

If you have a 24-bit number you will need to sign-extend the
most significant bit in order to produce a 32-bit number.

linux% cat temp
\$bits_24 = hex("ffbe8e");
\$bits_32 = \$bits_24 | ((\$bits_24 & 0x800000) ? 0xff000000 : 0);
printf "%d %.0f\n", \$bits_32, \$bits_32;

linux% perl temp
-16754 4294950542

## Re: Perl function for negative integers using the 2's complement in hex?

Thanks for the help, guys.  It is a 24 bit number I'm working with.

## Re: Perl function for negative integers using the 2's complementin hex?

stylechief wrote:

> I cannot seem to find a Perl function that will return the 2's
> complement of a negative integer represented in hex.
> For example:
> ffbe8e should return  -16754, not 16760462

Well, on a 32-bit computer, that should be ffffbe8e.  ffbe8e
would be the same as 00ffbe8e, which is positive.

Try:

perl -e "print unpack 'i',pack 'i',0xffffbe8e"

[exchange " and ' for Unix or Unix-like systems]

>
> hex() works fine for positive integers but not here
> pack/unpack don't seem to want to produce anything negative (just 0)
>
> I imagine that there is a 'brute force' method, but it seems that there
> should be an eloquent function that speaks in 2's complement . . . .
....
> Liam
>
--
Bob Walton
Email: http://bwalton.com/cgi-bin/emailbob.pl

----== Posted via Newsfeeds.Com - Unlimited-Uncensored-Secure Usenet News==----
http://www.newsfeeds.com The #1 Newsgroup Service in the World! 120,000+
Newsgroups
----= East and West-Coast Server Farms - Total Privacy via Encryption =----

## Re: Perl function for negative integers using the 2's complement in hex?

That works like a charm when one can explicitly pass a hex number like
the above example.  However, for whatever reason, when one attempts to
read from a binary file and use unpack() to deliver the hex numbers,
one gets:
Argument "ffbe8e" isn't numeric in pack at E:\Test\bif.plx line 5.

code:
open (BINARYFILE, "<000332") || die "Cant open: \$!\n";
\$data= unpack 'H*',\$data;
print unpack 'i',pack 'i',\$data;
print "\n";
}
close (BINARYFILE) || die"Cant close: \$!\n";

It *is* unpacking to a 24 bit hex number, but fails to see this number
as numeric.  It gets "stringified" somehow.

## Re: Perl function for negative integers using the 2's complement in hex?

What does?

What example above?

Please compose followups the normal way and quote some context.

--
Fort Worth, Texas

## Re: Perl function for negative integers using the 2's complementin hex?

stylechief wrote:

No, it is unpacking to a six-character string of hexadecimal digits.
The phrase "24 bit hex number" is meaningless, what you've got is
a 24-bit number expressed as a string of hexadecimal digits.

Using 'H' with unpack() returns a string, not a number.
The string of hexadecimal digits needs to go through the hex() function
in order to be numeric.

\$hexdata = unpack 'H*',\$data;
\$integer = hex \$hexdata;
print unpack 'i', pack 'i',\$integer;

or

\$four_bytes = '\x00' . \$three_bytes;
\$integer = unpack 'i',\$four_bytes;

or

\$sign_extend = (\$three_bytes & "\x80\x00\x00") ? "\xff" : "\x00";
\$four_bytes = \$sign_extend . \$three_bytes;

(Obviously, little-endian machines and big-endian ones need to
handle those last two differently.)

-Joe

## Re: Perl function for negative integers using the 2's complement in hex?

Thanks to all for your time and consideration.  The solution that I was
seeking:

open (BINFILE, "<000332") || die "Cant open: \$!\n";