入门级问题,C#的16进制表示的问题
为了看的清楚点我每四位用,号分开,实际程序里没这个,号。
我定义了这么个变量
int x=0xfff,ffff; //OK 没问题
然后我又这么定义
int y=0xffff,ffff;
// 错: Cannot implicitly convert type 'uint' to 'int'. An explicit
// conversion exists (are you missing cast)
这我就非常的不理解。 0xffff,ffff 不是-1吗,-1不就是有符号数,怎么还不能隐式的从 无符号 uint
转换为 int;
高手给点明解释下。 另外我想:我定义这个int y变量装个 16进制的负1,应该是轻松小菜一碟,没想到就这也能遇到坑爹的错误。真不知道设计C#语言这个儿货怎么想的。
------解决方案--------------------C#是强类型语言,0xFFFFFFFF 已经超出了 int 的表示范围,编译器会把它当做一个 uint 类型,uint 不能隐式的转换为 int。对于强类型的语言,0xFFFFFFFF 和 -1 并不是一回事。
------解决方案--------------------当你享受强类型语言带给你好处的同时也必然承受它的局限性。当然也有人不愿意接受这种局限,那种牛人都自己写编程语言去了。
------解决方案--------------------互相的强制转换限制
------解决方案--------------------using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
byte[] b = BitConverter.GetBytes((uint)0xffffffff);
int i = BitConverter.ToInt32(b, 0);
Console.WriteLine(i);
}
}
}
------解决方案--------------------int y = (int)0xffffffffU;
强制类型转换就可以了,类型检测是为了减少低级错误。