加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 与Ushort的结果混淆

发布时间:2020-12-15 08:42:24 所属栏目:百科 来源:网络整理
导读:考虑以下代码: 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.怎么样? 任何帮助明显…… 解
考虑以下代码:
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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读