C#-常量值';4294901760';无法转换为';int';

C#-常量值';4294901760';无法转换为';int';,c#,windows-phone-7,C#,Windows Phone 7,您好 我不敢相信我会问这样一个基本的问题,但它没有意义,所以它在这里:) 在Windows Phone 7/.net上的C#中,我试图在类中定义一个常量,如下所示: // error CS0266: Cannot implicitly convert type 'uint' to 'int'. // An explicit conversion exists (are you missing a cast?) public const int RED = 0xffff0000; 如果像这样对

您好

我不敢相信我会问这样一个基本的问题,但它没有意义,所以它在这里:)

在Windows Phone 7/.net上的C#中,我试图在类中定义一个常量,如下所示:

// error CS0266: Cannot implicitly convert type 'uint' to 'int'. 
// An explicit conversion exists (are you missing a cast?)
public const int RED = 0xffff0000;
如果像这样对其进行(int)转换,则会出现另一个错误:

// error CS0221: Constant value '4294901760' cannot be converted to a 'int' 
// (use 'unchecked' syntax to override)        
public const int RED = (int)0xffff0000;
但是我知道我的int是32位的,因此它的范围是-2147483648到2147483647,请参阅

那么是什么原因呢

提前谢谢


正如您所注意到的,
Int32
的范围是-2147483648到2147483647,因此可以保留该范围内的任何数字,但只能保留该范围内的数字。4294901760大于2147483647,因此不适合
Int32

对此该怎么做取决于你想要实现什么。如果您只需要一个位模式为
ffffff0000
Int32
,则按照建议使用
未选中的

int y = unchecked((int)0xffff0000);
y
现在的值为-65536,即解释为有符号整数的位模式


然而!如果您确实需要值4294901760,则应使用适合它的数据类型-因此
UInt32

int
是一个介于-2147483648到2147483647之间的有符号整数。

您需要的是一个无符号整数,即
uint
,就像第一条错误消息告诉您的那样。

尝试按照编译器消息的建议使用unchecked:

public const int RED = unchecked((int)0xffff0000);

这将
RED
定义为-65536,即0xffff0000,被解释为带符号整数。

这将帮助您绕过未选中的:

public const uint RED = 0xffff0000;
public const int RED = 0xffff << 16;

public const int RED=0xffff当然可以。一定是迟到了!所以如果使用unchecked,c#会截断值还是将其环绕,从而保留数据?。因此:在未检查的上下文中,如果表达式生成的值超出了目标类型的范围,则结果将被截断。@Vik该页面有点误导(最新版本更好)-因为这里的数据类型大小相同,所以它不是真正的“截断”您是对的AakashM,值将重新开始:从最小值+溢出大小。谢谢AakashM!混乱源于c#处理int32和uint32的方式。。。那就清楚了!