我在编写代码的数学和转换过程时遇到了一些麻烦。我理解它是如何得到这笔钱的,但它怎么会变成负面的呢?
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
很少帮忙?
答案 0 :(得分:1)
30000 + 30000 = 60000,但短只能代表-32768~32767(-2 ^ 15~2 ^ 15 - 1)
因此,发生溢出,并返回60000 - 65536(2 ^ 16)= - 5536
您必须明白,您处理的所有值实际上都是计算机内的二进制形式。
短类型用16位或2字节表示。 二进制形式的30000是0111 0101 0011 0000,和 二进制形式的60000是1 1110 1010 0110 0000,并且只有最后16位用于表示短值。
要理解将此二进制值转换为十进制值,您必须对https://en.wikipedia.org/wiki/Two's_complement有一些了解,但简而言之,它转向-5536。 65536来自这样的事实:65536(2 ^ 16)的倍数在二进制形式的末尾至少有16'0。