Isaac
Isaac

Reputation: 12874

Byte overflow evaluate to zero instead of exception?

static void Main(string[] args)
{
  int n;
  byte b;
  n = 256;
  b = (byte) n;
  Console.WriteLine(b); //0
}

C# byte range is 0 to 255 and hence I try to cast an int of 256 to byte and see what will happen.

Surprisingly it returns 0 instead of 255 or better yet give me an overflow exception?

UPDATES: I'm trying it on macos which is Mono, if it matters and .NET Framework 4.7

Upvotes: 3

Views: 382

Answers (2)

Jordan Motta
Jordan Motta

Reputation: 188

I would like to complement the previous answer.

Take a look at this:

255 -> 11111111 +

001 -> 00000001

256 -> 100000000

As you can see. We have 256 in binary format, but as your number is eight bits, 1 can't be stored. This leave the number 00000000 which is zero.

This is more theory than C# specific question. But i think this is important to understand.

Upvotes: 2

Sweeper
Sweeper

Reputation: 270995

That is the expected behaviour. If you think about it, 256 is one "1" followed by 8 zeroes in binary. When you take away everything except the least significant 8 bits, you get 8 zeroes, which is the value 0.

From the C# language specification §6.2.1:

For a conversion from an integral type to another integral type, the processing depends on the overflow checking context (§7.6.12) in which the conversion takes place:

  • In a checked context, the conversion succeeds if the value of the source operand is within the range of the destination type, but throws a System.OverflowException if the value of the source operand is outside the range of the destination type.
  • In an unchecked context, the conversion always succeeds, and proceeds as follows.
    • If the source type is larger than the destination type, then the source value is truncated by discarding its “extra” most significant bits. The result is then treated as a value of the destination type.

If you want an exception, you can used checked:

b = checked((byte) n);

Upvotes: 6

Related Questions