Search code examples
hextcldecimaldata-conversion

TCL: How to convert a hex value to signed integer?


This command assumes that the hex represents unsigned value:

set q 0xffffb764
set r [expr $q]
puts $r

Is there a simple way to make it treat q as representing a signed value rather than an unsigned value?


Solution

  • This is my solution:

      proc hex_to_signed {value} {
        set sign [expr {($value & 0b10000000000000000000000000000000)}]
        set mag  [expr {($value & 0b01111111111111111111111111111111)}]
        if {$sign==0} {
          set exp 0
        } else {
          set exp [expr -2**31]
        }       
        set value [expr {$exp + $mag}]
        return $value
      }