Link to home
Start Free TrialLog in
Avatar of jdcoburn
jdcoburn

asked on

conversion from a byte to a signed byte

hi - i'm using C#, VS2010 and .net 4. I have a line of code --

mesDataDisplay_WFG.graph.PlotYAppend((double)(Convert.ToSByte(HIDData[0])), xIncrement);

where the HIDData is typed as a byte array. I get an overflow exception saying that the value '254' is an overflow. I would have expected it to convert automatically to -2. it's not that I can't do the arithmetic to make it work, but I don't understand why it doesn't make the conversion.
thanks.
Avatar of kaufmed
kaufmed
Flag of United States of America image

There is no such thing as a "signed" byte. Valid byte values are 0 to 255.

User generated image
This is not quite correct:
http://msdn.microsoft.com/en-us/library/a7yfs6t2.aspx

Convert.ToSByte(Byte)

"Converts the value of the specified 8-bit unsigned integer to the equivalent 8-bit signed integer."

Throws OverflowException if value is greater than SByte.MaxValue (The value of this constant is 127; that is, hexadecimal 0x7F).
See http://msdn.microsoft.com/en-us/library/system.sbyte.maxvalue.aspx.
ASKER CERTIFIED SOLUTION
Avatar of Dmitry G
Dmitry G
Flag of New Zealand image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
static void Main(string[] args)
        {
            UInt16[] numbers = { 127, 128, 65535, 65534 };
            Int16 output;
            Int16 counter;
            for (counter = 0; counter < 4; counter++)
            {
                output = unchecked((Int16)numbers[counter]);
                Console.WriteLine("Output = {0}", output);
            }
            Console.ReadLine();
        }

gives me the results
Output = 127
Output = 128
Output = -1
Output = -2

I run on a 64bit computer therefor int8 is not available.  If I change it to
Int16[] numbers = { 127, 128, 65535, 65534 };
the last 2 values are greater than maxint16
Avatar of jdcoburn
jdcoburn

ASKER

well done - this is exactly what I needed. the first comment was not only wrong, it was snooty.
thanks,
I concede that it was incorrect--in terms of no sbyte, not in terms of the valid values for byte, but it wasn't intended to be snooty. (I'm honestly not certain what part of my statement could be considered "snooty.") I was thinking about the type incorrectly. Every other integral type in .NET that is signed is simply its name (e.g. Int16, Int32, Int64), and the unsigned equivalents all start with a "U" (e.g. UInt16, UInt32, UInt64). It was simply a flawed projection by me that you were stuck with byte since there was no "UByte". I completely overlooked that there was an sbyte.