作者tomex (tomex_ou)
看板C_Sharp
标题Re: C#的加减乘除
时间Thu Oct 14 22:50:07 2004
※ 引述《ithinkurdumb (YANKEES RULE ALL!)》之铭言:
: 发现一个现象,
: 我在VS.NET 2003 / VS 2005里面,
: 没办法对两个非Int32作四则运算.
: 也就是说像
: Int16 MyInt1 = 10;
: Int16 MyInt2 = 20;
: Int16 MyInt3 = MyInt1 + MyInt2;
: compile的时候会出现一个error,
: "Cannot implicitly convert type 'int' to 'short'".
请参考:
http://weblogs.asp.net/oldnewthing/archive/2004/03/10/87247.aspx
它简单的意思是说,假如short+short的总合也被认作是short
那麽万一两个short的加总超过short型别允许大小,
就有runtime的危险,称为int overflow。
例如an unsigned char (8-bit) integer type:
unsigned char a = 255;
unsigned char b = 2;
unsigned char result = a + b;
相加时会转换成2进位相加:
11111111 (a)
+00000010 (b)
--------
100000001 (result)
因只有8位元,因此最前面的1被忽略,答案变成1。
所以在c#内,会把short的型别加大一级成int32,避免溢位。
但在int的运算里,却没啥问题,我测过临界值的相加,会被成负的
但不会有compile错误。
在c里,int只有16位元,.net後变成32
如此大的位元,可能也为了防止这些错误的发生率
所以写程式不要太省,统一都用int来宣告整数,是比较好的。
该篇作者的结论是说,为了防止可能的overflow,是要一直写烦人的转型别
不过这胜过真正发生溢位问题时,所带来的後果要轻多了...
对此有研究知道原因的前辈,可以教教大家!
--
You're recommended to vist C_Sharp in PTT.
We are the C#, resistance is futile.
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.119.183.211
1F:推 cplusplus:int 8 位元? 140.115.205.46 10/15
※ 编辑: tomex 来自: 140.119.183.211 (10/15 07:35)