有了前次float类型的教训以后,我开始复习C#的数据类型,今天在网上发现一篇有意识的文章:
short
s
=
0
;
s = s + 1 ;
和
short s = 0 ;
s += 1 ;
这两个表达式有什么区别,会报什么错误?
s = s + 1 ;
和
short s = 0 ;
s += 1 ;
这两个表达式有什么区别,会报什么错误?
头晕了,我哪到群里去问,很多朋友都说两个没有区别。
还是用事实来说话。测试:
经测试:
第一个会报错:错误 1 无法将类型“int”隐式转换为“short”。存在一个显式转换(是否缺少强制转换?) E:/MVC/Test/Test/Form1.cs 40 17 Test
第二个通过编译,运行正常。
后来找到解释:
s
=
s
+
1
; 由于
1
默认是int型的,s是short的,
"
s+1
"
的结果默认是int的,把int的结果赋值给short时会报错,损失精度了,必须写成 s
=
(
short
)(s
+
1
) 来强制转化一下
s += 1 ; 在编译时已经明确最后要赋值给s,即short型的,所以会在内部自动进行转换的,
s += 1 ; 在编译时已经明确最后要赋值给s,即short型的,所以会在内部自动进行转换的,
自动转换一般从低的往高的转换,所以第一个会报错
呵呵,原来如此。顺便把C#的数据类型贴上,大家一起复习:
#是基于Microsoft的.net框架的,他的基础部分就是共享的通用类型系统(CTS,Common Type System)。下面是C#和java数据类型的等价类型。
c#数据 类型 | java数据 类型 | 运行时 类型 | 大小 (字节) | 范围 | 描述 |
bool | boolean | Boolean | n/a | true or false | 布尔值 |
byte | Byte | 1 | 0~255 | 无符号整数 | |
char | char | Char | 2 | 0x0000~0xffff | Unicode字符 |
decimal | Decimal | -79,228,162,514,264,337,593,543,950,335~ 79,228,162,514,264,337,593,543,950,335 | 十进制数字 | ||
double | double | Double | 8 | -1.79769313486232e308~ 1.79769313486232e308 | 双精度64位数字 |
float | float | Single | 4 | -3.402823e38~3.402823e38 | 单精度32位数字 |
int | int | Int32 | 4 | -2,147,483,648~2,147,483,647 | 有符号整数 |
long | long | Int64 | 8 | -9,223,372,036,854,775,808~ 9,223,372,036,854,775,807 | 有符号整数 |
sbyte | byte | SByte | 1 | -128~127 | 有符号整数 |
short | short | Int16 | 2 | -32768~32767 | 有符号整数 |
unit | UInt32 | 4 | 0~4,294,967,295 | 无符号整数 | |
ulong | UInt64 | 8 | 0~184,467,440,737,095,551,615 | 无符号整数 | |
ushort | UInt16 | 2 | 0~65535 | 无符号整数 |
在c#中,所有书类型也都是System的一部分,可以在其中引用。如bool可以引用为System.Boolean