Author Topic: How to construct a Signed Short from Bytes  (Read 34 times)

Nick_W

  • Full Member
  • ***
  • Posts: 215
    • View Profile
How to construct a Signed Short from Bytes
« on: September 02, 2016, 04:59:14 pm »
I had some problems making a signed Short from two bytes (in a ListOfBytes). As a Short is signed, I thought the result would be signed by default - well it isn't!

This was my code:

Code: [Select]
    //**************************************************************************/
    //
    //    @brief  Reads a signed 16 bit value over I2C
    //
    //**************************************************************************/
    Public Function readS16(reg As Byte) As Integer //should return Short
        Dim result As Short = 0
        Dim value As ListOfByte = read2X8(reg)
        If value <> Nothing Then
            result = (value(0) << 8) | value(1)
            //result = value.ExtractShort(0, Endianness.Big) //not working
        End If
        Return result
    End Function

So first ExtractShort() doesn't work (although this does exactly what I want - I think). The above always returns an unsigned Short (as Integer). Even if you change the return type to Short, it still returns an unsigned Short (or Integer, not sure which).

To make it a Signed Short (or Integer) I had to manually convert it to two's compliment:

Code: [Select]
    //**************************************************************************/
    //
    //    @brief  Reads a signed 16 bit value over I2C
    //
    //**************************************************************************/
    Public Function readS16(reg As Byte) As Integer //should return Short
        Dim result As Short = 0
        Dim value As ListOfByte = read2X8(reg)
        If value <> Nothing Then
            result = (value(0) << 8) | value(1)
            //result = value.ExtractShort(0, Endianness.Big) //not working
        End If
        //convert value to 2's compliment
        If (value(0) > 0x7f) Then
            result = (~result + 1) * (-1)
        End If
        Return result
    End Function

Just thought I would point this out for anyone manipulating bytes out there. Anyone know how to use ExtractShort() or why it doesn't work in the above?

Thanks,

Share on Facebook Share on Twitter