首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Ushort的结果混淆

与Ushort的结果混淆
EN

Stack Overflow用户
提问于 2012-03-05 16:55:09
回答 3查看 233关注 0票数 6

考虑以下代码:

代码语言:javascript
复制
ushort a = 60000;
a = (ushort)(a * a / a);
Console.WriteLine("A = " + a);  

//这将打印53954。为什么??

代码语言:javascript
复制
ushort a = 40000;
a = (ushort)(a * a / a);
Console.WriteLine("a = " + a.ToString());

//这将打印40000。怎么做?

任何有价值的帮助..。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-03-05 17:03:09

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

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

例如,这将打印0:

代码语言:javascript
复制
ushort myShort = 65535;
myShort++;
Console.WriteLine(myShort); //0

如果你把它分成几个步骤,就更容易看出来了:

代码语言:javascript
复制
var B = A * A;

这实际上超出了int32的容量,所以它从-2,147,483,648开始,因此b等于-694967296,然后当你拆分B/A时,得到:-11582,当转换成ushort时,它变成了53954。

代码语言:javascript
复制
ushort A = 60000;
var B = A * A; //-694967296
var C = B / A; //-11582
ushort D = (ushort)(C); //53954

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

代码语言:javascript
复制
ushort A = 40000;
var B = A * A; //1600000000
var C = B / A; //40000
ushort D = (ushort)(C); //40000

不过,uint可以容纳60000^2,所以这是可行的:

代码语言:javascript
复制
ushort A = 60000;
var B = (uint)A * A; //3600000000
var C = B / A; //60000
ushort D = (ushort)(C); //60000

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

代码语言:javascript
复制
96
234
0
0

D的字节数为:

代码语言:javascript
复制
96
234

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

票数 7
EN

Stack Overflow用户

发布于 2012-03-05 17:10:59

因为它相当于

A * A = -694967296,因为结果以整型结束,而短整型上的溢出给出了一个位模式,从而产生了这个负结果。归根结底,60000 * 60000不能存储在ushort中。在调试模式下添加一个监视,您将看到以下内容。

然后你就有了

-694967296 / 60000 -它将-11582转换为一个整数,但当转换为ushort时,它会产生53954的值-同样是因为底层的位模式。

实际上,这段代码需要放在checked块中,因为正是由于这个原因,溢出错误才会导致大量问题。

票数 3
EN

Stack Overflow用户

发布于 2012-03-05 17:07:40

第一个好问题!现在让我告诉你一件事,如果你尝试40000,它会工作得很好。

原因是(40000 ^ 2)是用户的最高限制,因此它将转换为整数,因此不会被截断!

如果您使用60000,它将会!由于限制限制!

40000上试用吧!

希望你能得到我的答案

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9563893

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档