Shortは2バイト型で、1バイトは1バイトです。2バイトから1バイトにキャストすると、システムに適切なものを強制し、元のバイトの1つ(最も重要なバイト)が削除され、データが失われます。23948(バイナリ:0101 1101 1000 1100)の値から残っているのは140で、これはバイナリでは10001100に変換されます。
0101 1101 1000 1100 (2 byte decimal value 23948)
に:
1000 1100 (1 byte decimal value 140)
これは、明示的なキャストでのみ実行できます。キャストなしでバイトにshortを割り当てようとすると、データが失われる可能性があるため、コンパイラはエラーをスローします。
タイプ「short」を「byte」に暗黙的に変換することはできません。明示的な変換が存在します(キャストがありませんか?)
一方、バイトからショートにキャストする場合は、データが失われることはないため、暗黙的にキャストできます。
using System;
public class MyClass
{
public static void Main()
{
short myShort = 23948;
byte myByte = (byte)myShort; // ok
myByte = myShort; // error:
Console.WriteLine("Short: " + myShort);
Console.WriteLine("Byte: " + myByte);
myShort = myByte; // ok
Console.WriteLine("Short: " + myShort);
}
}
算術オーバーフローとチェックされていないコンテキストの場合:
using System;
public class MyClass {
public static void Main() {
unchecked {
short myShort = 23948;
byte myByte = (byte)myShort; // ok
myByte = myShort; // still an error
int x = 2147483647 * 2; // ok since unchecked
}
}
}