Question about Hex => Signed Int

Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write something
to do the conversion? Sorry if this question is stupid but i’m pretty
new to all this.

0xFF467A7B => -12158341
0x38CFEF => 3723247

Thanks

On Jan 9, 2008, at 2:48 PM, Tim C. wrote:

Hello,
Is there a ruby function to convert the following hexadecimal numbers
into the corresponding signed integers or will i need to write
something
to do the conversion? Sorry if this question is stupid but i’m pretty
new to all this.

0xFF467A7B => -12158341
0x38CFEF => 3723247

The tricky part is dealing with the twos compliment notation but
String#to_i will do the hex/decimal conversion:

“0xFF467A7B”.to_i(16) - 0x100000000
=> -12158341

“0x38CFEF”.to_i(16)
=> 3723247

Gary W.

Gary W. wrote:

The tricky part is dealing with the twos compliment notation but
String#to_i will do the hex/decimal conversion:

“0xFF467A7B”.to_i(16) - 0x100000000
=> -12158341

“0x38CFEF”.to_i(16)
=> 3723247

Gary W.

Thanks for that. Is there a ruby function which I can pass a hex number
and it works out if it is +/- and then returns the correct decimal
value?

Tim C. wrote:

Gary W.

Thanks for that. Is there a ruby function which I can pass a hex number
and it works out if it is +/- and then returns the correct decimal
value?

Convert to unsigned first, like above, then do something like this:

 length = 32 # in bits; you have to choose this

 mid = 2**(length-1)
 max_unsigned = 2**length
 to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

 p to_signed["0xFF467A7B".to_i(16)]
 p to_signed["0x38CFEF".to_i(16)]

See Two's complement - Wikipedia.

Thanks a lot, that works a treat.

Ken B. wrote:

 max_unsigned = 2**length
 to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

 p to_signed["0xFF467A7B".to_i(16)]
 p to_signed["0x38CFEF".to_i(16)]

See Two's complement - Wikipedia.

Why go through all the trouble to make this a proc?

Cut and paste from some code that was using #define_method with this
proc, and thereby saved performing the exponentiations on each call.
That’s all.

On Thu, 10 Jan 2008 13:19:46 -0500, Joel VanderWerf wrote:

 max_unsigned = 2**length
 to_signed = proc {|n| (n>=mid) ? n - max_unsigned : n}

 p to_signed["0xFF467A7B".to_i(16)]
 p to_signed["0x38CFEF".to_i(16)]

See Two's complement - Wikipedia.

Why go through all the trouble to make this a proc?

–Ken