C# 字节到整数的转换

C# 字节到整数的转换,c#,type-conversion,C#,Type Conversion,我在数学和代码转换过程中遇到了一些麻烦。我知道它是怎么得到那个总数的,但为什么它变成了负数 static void Main(string[] args) { short numb1 = 30000, numb2 = 30000; short answer = (short)Add(numb1, numb2); Console.WriteLine("{0} + {1} = {2}", numb1, numb2, answer); NarrowingAttempt(

我在数学和代码转换过程中遇到了一些麻烦。我知道它是怎么得到那个总数的,但为什么它变成了负数

static void Main(string[] args)
{
    short numb1 = 30000, numb2 = 30000;
    short answer = (short)Add(numb1, numb2);
    Console.WriteLine("{0} + {1} = {2}", numb1, numb2, answer);
    NarrowingAttempt();
    Console.ReadLine();
}

static int Add(int x, int y)
{
    return x + y;
}

static void NarrowingAttempt()
{
    byte myByte = 0;
    int myInt = 200;

    myByte = (byte)myInt;
    Console.WriteLine("Value of myByte: {0}", myByte);
}
这将返回:

30000 + 30000 = -5536

帮助不大?

30000+30000=60000,但short只能表示-32768~32767(-2^15~2^15-1)

因此,发生溢出,并返回60000-65536(2^16)=-5536

您必须了解,您处理的所有值实际上都是计算机内部的二进制形式

短类型用16位或2字节表示。 二进制形式的30000为0111 0101 0011 0000,且 二进制形式的60000是1110 1010 0110 0000,只有最后16位用于表示短值

要理解将这个二进制值转换成十进制值,您必须对的_补码有一些了解,但简而言之,它变成了-5536。
65536源于这样一个事实:65536(2^16)的倍数在二进制形式的末尾至少有16'0。

2*16是什么意思?它只是意味着65536是2乘以16的幂(2^16,2**16等)