Dr. Rajesh Rolen
Dr. Rajesh Rolen

Reputation: 14285

Result of addition of two bytes when it cross its limit

let i have got two byte variable:

byte a= 255;
byte b= 121;

byte c= (byte) (a + b);

Console.WriteLine(c.ToString());

output:120

please explain me how this is adding values. i know that its crossing size limit of byte but don't know what exactly operation it performs in such situation because its not looking like its chopping the result.

Thanks

EDIT: sorry its 120 as a answer.

Upvotes: 0

Views: 3681

Answers (4)

Darin Dimitrov
Darin Dimitrov

Reputation: 1039498

You are overflowing the byte storage of 255 so it starts from 0.

So: a + b is an integer = 376

Your code is equivalent to:

byte c = (byte)376;

That's one of the reasons why adding two bytes returns an integer. Casting it back to a byte should be done at your own risk.

If you want to store the integer 376 into bytes you need an array:

byte[] buffer = BitConverter.GetBytes(376);

As you can see the resulting array contains 4 bytes now which is what is necessary to store a 32 bit integer.

Upvotes: 8

Chris Shaffer
Chris Shaffer

Reputation: 32585

As others are saying, you are overflowing; the a+b operation results in an int, which you are explicitly casting to a byte. Documentation is here, essentially in an unchecked context, the cast is done by truncating the most significant bits.

Upvotes: 1

Øyvind Bråthen
Øyvind Bråthen

Reputation: 60744

I guess you mean byte c= (byte)(a + b);

On my end the result here is 120, and that is what I would expect.

a+b equals 376, and all bits that represent 256 and up gets stripped (since byte actually only hold 1 byte), then 120 is what you are left with inside your byte.

Upvotes: 0

Dirk Vollmar
Dirk Vollmar

Reputation: 176259

It gets obvious when you look at the binary representation of the values:

var | decimal | binary
----|----------------------
  a |     255 |   1111 1111
  b |     121 |   0111 1001
    |         |
a+b |     376 | 1 0111 1000

This gets truncated to 8 bits, the overflow bit is disregarded when casting the result to byte:

  c |         |   0111 1000 => 120

Upvotes: 5

Related Questions