拓荒者 dstang2000 http://www.dstang.com

KISS:Keeping things that work,Improve systems procedures styles,Start things of value,Stop things of no value
随笔 - 3, 文章 - 1, 评论 - 17, 引用 - 0
数据加载中……

分不清正数负数,是我错了,还是VS.NET错了

三年前做的一个ASP.NET的项目(www.SurveyStar.net),一直运行好好的,
前几天,客户打电话来说,出了问题。
反复跟踪,发现是一个正数、负数的判断与ToString()的问题。
将问题简化后,源程序可表示为只有4句的程序,如下:

class Test
{
    
static void Main()
    
{
        
int a = 0x79de61c0//2044617152;
        a +=    0x12345678;    
        
//a 应为 0x8c12b838;  //-1944930248

        
if( a< 0 ) a = -a;

        
//string str1 = a.ToString();
        System.Console.WriteLine( a );
        
//string str2 = a.ToString();
    }

}

按理说,这里的if(a<0) a=-a 应当将之转成了正数,但是问题来了:
如果在前面加上了str1一句,或者后面加上了str2一句,或者前后都加上,
显示的a居然是负数 -1944930248。这真是一个奇怪的问题。
是我错了,还是微软错了?

我查看了IL代码,没有找到问题,不知有无高人能指出其中的原因。
附:IL代码1:
#regin 不加str1及str2
.method 
private hidebysig static void  Main() cil managed
 // end of method Test::Main
#endregion
#regin 加上str1
.method 
private hidebysig static void  Main() cil managed
 // end of method Test::Main
#endregion

#regin 加上str2
.method 
private hidebysig static void  Main() cil managed
 // end of method Test::Main
#endregion



0
0
(请您对文章做出评价)
» 下一篇:小工具RssInIE: 在IE中点右键,可以直接查看RSS

posted on 2005-03-05 14:45 拓荒者 阅读(2174) 评论(5)  编辑 收藏 网摘 所属分类: Csharp语言

评论

#1楼   回复  引用  查看    

我试了一下,果然象拓荒者说的那样。

if( a< 0 ) a = -a;
换成
a = Math.Abs(a);
在我的机子上就没问题了。
不过为什么我也搞不明白。期待高手的回答。
2005-03-05 15:49 | 紫风      

#2楼   回复  引用    


如果
a = -1944930248;
if( a< 0 ) a = -a;

string str1 = a.ToString();
System.Console.WriteLine( a );
string str2 = a.ToString();
则不会出现这个问题
问题应该出在.net对于溢出数据的处理手法,这个我也不清楚
可见abs并不是用-a来表示负数的
2005-03-05 17:12 | KingofSC

#3楼   回复  引用    

是那个判断出了问题,或许是JIT的BUG,这两个程序生成的汇编代码是不一样的...

这个问题可以进一步简化为:


int a = 0x79de61c0; //2044617152;
a += 0x12345678;
//a should be 0x8c12b838; //-1944930248

if (a > 0)
{
Console.WriteLine("greater than zero");
}
else
{
Console.WriteLine("not greater than zero");
}

string str1 = a.ToString();
2005-03-05 18:51 | Justin Shen

#4楼[楼主]   回复  引用  查看    

提示:感谢.NET CFer对此提供了分析:
http://www.cnblogs.com/sumtec/archive/2005/03/06/113748.html
2005-03-06 01:12 | 拓荒者      

#5楼[楼主]   回复  引用  查看    

提示: 已经确认这是一个JIT的BUG,请参见:

http://blog.joycode.com/sumtec/archive/2005/03/09/45514.aspx
2005-03-09 20:41 | 拓荒者