日期:2014-05-17  浏览次数:20874 次

入门级问题,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;
强制类型转换就可以了,类型检测是为了减少低级错误。