c# – 与Ushort的结果混淆

前端之家收集整理的这篇文章主要介绍了c# – 与Ushort的结果混淆前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
考虑以下代码
ushort a = 60000;
a = (ushort)(a * a / a);
Console.WriteLine("A = " + a);

//这打印53954.为什么?

ushort a = 40000;
a = (ushort)(a * a / a);
Console.WriteLine("a = " + a.ToString());

//这打印40000.怎么样?

任何帮助明显……

解决方法

因为60000 ^ 2是3600000000,但是int可以容纳的最大数字是2,147,483,647,所以它从-2,648开始.

一个ushort可以容纳65,535,然后从0开始:

例如,这打印0:

ushort myShort = 65535;
myShort++;
Console.WriteLine(myShort); //0

如果将其分解为多个步骤,则更容易看到这个:

var B = A * A;

这实际上超过了int32的容量,因此它从-2,648开始,因此b等于-694967296
然后,当你分割B / A时,你得到:-11582,当投入到一个ushort时变为53954.

ushort A = 60000;
var B = A * A; //-694967296
var C = B / A; //-11582
ushort D = (ushort)(C); //53954

40000工作的原因是它不超过int32的容量.

ushort A = 40000;
var B = A * A; //1600000000
var C = B / A; //40000
ushort D = (ushort)(C); //40000

uint可以容纳60000 ^ 2,所以这可行:

ushort A = 60000;
var B = (uint)A * A; //3600000000
var C = B / A; //60000
ushort D = (ushort)(C); //60000

将C转换为ushort yeilds 53954的原因是因为C的字节是:

96
234
0
0

而D的字节是:

96
234

所以它们保持相同的后备字节,这就是为什么你得到53954和-11582

猜你在找的C#相关文章