首页 新闻 会员 周边

C#中类型转换问题

0
悬赏园豆:10 [已解决问题] 解决于 2009-02-09 00:48

为什么

  Byte b = 400;

编译不通过,而

  int a = 400;
  Byte b = (Byte)a;

编译却能通过?

 

问题补充: 呵呵,我知道是类型转换问题,应该说我问得不够好,应该这么问 Byte b = (Byte)400; //编译出现这个错误:常量值“400”无法转换为“byte”(使用“unchecked”语法重写) 而C#编译器默认的是unchecked,当然加上unchecked之后能通过编译,这个怎么说的,谢谢了 @Gray Zhang 照你说的话400是原子性的,是不可改变的,那为什么 Byte b =unchecked((Byte)400); 能通过编译 @Angel Lucifer 对于Byte b =unchecked((Byte)400); C#编译器默认是unchecked的,这里不加unckecked就不能通过编译,而且这里是先进行强制转换,之后变成Byte b =unchecked(144); ,但是这里我要直接这么写就可以Byte b=144; 呵呵,多谢两位了
Done的主页 Done | 初学一级 | 园豆:128
提问于:2009-01-26 19:17
< >
分享
最佳答案
0

我来回答一下问题补充。

这里编译器的警告是正确的。

因为 Byte 表示一个8 位无符号整数,它只能表达区间[0,255]之间的整数。

400 明显超过了这个范围,加上 unchecked 关键字后,编译器做了转换,但是这个结果是不正确的。

注意,这里的转换是强制性的位数截断,所以结果不正确。

在楼主所举的能通过编译的例子中,计算过程是这样的:

 400 表示的二进制数字为 00000000000000000000000110010000

中间经过位数截断后 b 成为 10010000

也就是仅仅保留了 400 的后 8 位.

 

由此可以看出类型转换时,高位数向低位数转换存在的风险。所以,我们在转换时,尤其是强制类型转换(即显式转换)时,应当小心不要跨越边界。

 

同时,我们也可以看出 C# 编译器的智能程度,它可以杜绝这方面的问题。只因为 C# 是门类型安全和元数据丰富的编程语言。

Angel Lucifer | 小虾三级 |园豆:775 | 2009-01-27 14:13
其他回答(2)
0

因为400是一个int的常量,而int不支持到byte的隐式转换

第二个代码,使用了int到byte的显式转换,而int是支持到byte的显式转换的

具体可以找本入门的书了解下隐式转换和显式转换的问题

Gray Zhang | 园豆:17610 (专家六级) | 2009-01-26 20:54
0

学习....

Jared.Nie | 园豆:1940 (小虾三级) | 2009-02-01 17:50
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册