Home » SQL & PL/SQL » SQL & PL/SQL » To convert a -ve number to Hexadecimal
|
|
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430790 is a reply to message #430785] |
Thu, 12 November 2009 06:05   |
ThomasG
Messages: 3212 Registered: April 2005 Location: Heilbronn, Germany
|
Senior Member |
|
|
That page doesn't explain with what *convention* they convert it.
One usual convention is to use a sign bit for negative values, which could be done in SQL with :
SQL> SELECT val,
2 To_Char(
3 Decode(
4 Sign(val), -1 , 65536 - Abs(val),
5 Abs(val)
6 ), 'XXXX') FROM
7 (SELECT ROWNUM - 10 val FROM dual
8 CONNECT BY LEVEL < 20);
VAL TO_CH
---------- -----
-9 FFF7
-8 FFF8
-7 FFF9
-6 FFFA
-5 FFFB
-4 FFFC
-3 FFFD
-2 FFFE
-1 FFFF
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
19 rows selected.
|
|
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430800 is a reply to message #430790] |
Thu, 12 November 2009 06:28   |
rtnataraj
Messages: 102 Registered: December 2008
|
Senior Member |

|
|
ThomasG wrote on Thu, 12 November 2009 17:35That page doesn't explain with what *convention* they convert it.
One usual convention is to use a sign bit for negative values, which could be done in SQL with :
SQL> SELECT val,
2 To_Char(
3 Decode(
4 Sign(val), -1 , 65536 - Abs(val),
5 Abs(val)
6 ), 'XXXX') FROM
7 (SELECT ROWNUM - 10 val FROM dual
8 CONNECT BY LEVEL < 20);
But I need to convert huge nummbers??
My Range
-1000175007 to 9999506679
regards,
Nataraj
[Updated on: Thu, 12 November 2009 06:30] Report message to a moderator
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430802 is a reply to message #430800] |
Thu, 12 November 2009 06:32   |
ayush_anand
Messages: 417 Registered: November 2008
|
Senior Member |
|
|
Quote:But I need to convert huge nummbers??
My Range
-1000175007 to 9999506679
does this include decimal numbers as well like 1.01 or -1.01 
what is the size of the word as well (when you say you are going to convert to negative like 16bit,8 bit)
Thomas example converts for 16 bit word
for 8 bit word
SQL> SELECT val,
2 To_Char(
3 Decode(
4 Sign(val), -1 , 256 - Abs(val),
5 Abs(val)
6 ), 'XXXX') FROM
7 (SELECT ROWNUM - 10 val FROM dual
8 CONNECT BY LEVEL < 20);
VAL TO_CH
---------- -----
-9 F7
-8 F8
-7 F9
-6 FA
-5 FB
-4 FC
-3 FD
-2 FE
-1 FF
0 0
1 1
VAL TO_CH
---------- -----
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
19 rows selected.
[Updated on: Thu, 12 November 2009 06:38] Report message to a moderator
|
|
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430812 is a reply to message #430800] |
Thu, 12 November 2009 06:48   |
flyboy
Messages: 1903 Registered: November 2006
|
Senior Member |
|
|
rtnataraj wrote on Thu, 12 November 2009 13:28But I need to convert huge nummbers??
My Range
-1000175007 to 9999506679
So change 65536 (= 16^4 = POWER(16, 4) in Oracle) with greater number. The best value would be the length of used format mask. Currently used mask 'xxx' (three hexadecimal digits) would not be able to show it anyway. Nine hexadecimal digits will suffice for that range, eight will not for the high value: SQL> select power(16,9), power(16,9)-1000175007, power(16,9)-9999506679 from dual;
POWER(16,9) POWER(16,9)-1000175007 POWER(16,9)-9999506679
----------- ---------------------- ----------------------
6.8719E+10 6.7719E+10 5.8720E+10
1 row selected.
SQL> select power(16,8), power(16,8)-1000175007, power(16,8)-9999506679 from dual;
POWER(16,8) POWER(16,8)-1000175007 POWER(16,8)-9999506679
----------- ---------------------- ----------------------
4294967296 3294792289 -5.705E+09
1 row selected.
SQL>
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430814 is a reply to message #430812] |
Thu, 12 November 2009 06:54   |
ayush_anand
Messages: 417 Registered: November 2008
|
Senior Member |
|
|
I think 32 bit word will suffice
SQL> ed
Wrote file afiedt.buf
1 SELECT val,
2 To_Char(
3 Decode(
4 Sign(val), -1 , 4294967296 - Abs(val),
5 Abs(val)
6 ), 'XXXXXXXX') FROM
7* (SELECT -1000175007 val FROM dual)
SQL> /
VAL TO_CHAR(D
---------- ---------
-1.000E+09 C4628A61
|
|
|
|
Re: To convert a -ve number to Hexadecimal [message #430859 is a reply to message #430768] |
Thu, 12 November 2009 10:44   |
flyboy
Messages: 1903 Registered: November 2006
|
Senior Member |
|
|
Thank you for feedback.
I am just curious which boundary you chose. Because, when using POWER(16,8), there might be problem with data ambiguity. A slight modification of ayush_anand's solution leads to this: SQL> SELECT val,
2 To_Char( Decode( Sign(val), -1 , 4294967296 - Abs(val), Abs(val) ),
3 'XXXXXXXX' ) val_hex FROM
4 (SELECT -1000175007 val FROM dual union all
5 SELECT 3294792289 FROM dual)
6 /
VAL VAL_HEX
---------- ---------
-1.000E+09 C4628A61
3294792289 C4628A61
2 rows selected.
SQL> Now, C4628A61 may represent number -1000175007 or 3294792289 (both are valid according to your post). Using POWER(16,9) (using this seems more understandable than that "magic" number above, although both are the same) should be safe: SQL> SELECT val,
2 To_Char( Decode( Sign(val), -1 , power(16,9) + val, val ),
3 'XXXXXXXXX' ) val_hex FROM
4 (SELECT -1000175007 val FROM dual union all
5 SELECT 67719301729 FROM dual)
6 /
VAL VAL_HEX
---------- ----------
-1.000E+09 FC4628A61
6.7719E+10 FC4628A61
2 rows selected.
SQL> (I just get rid of using ABS, as it is unnecessary).
|
|
|
|
Goto Forum:
Current Time: Thu Jun 05 03:53:56 CDT 2025
|