无法将32位十六进制值分配给整数

时间:2015-12-22 21:40:31

标签: c# types hex unsigned signed

  

首先,这个问题有相关的帖子:   Why Int32 maximum value is 0x7FFFFFFF?

但是,我想知道为什么十六进制值总是被视为无符号数量。

请参阅以下代码段:

byte  a = 0xFF;               //No error (byte is an unsigned type).
short b = 0xFFFF;             //Error! (even though both types are 16 bits).
int   c = 0xFFFFFFFF;         //Error! (even though both types are 32 bits).
long  d = 0xFFFFFFFFFFFFFFFF; //Error! (even though both types are 64 bits).

错误的原因是因为十六进制值始终被视为无符号值,无论它们存储的数据类型如何。因此,对于所描述的数据类型,值'

<小时/> 例如,我预计:

int c = 0xFFFFFFFF;

存储值:

-1

而不是价值:

4294967295

只是因为int签名的类型。

<小时/> 那么,为什么十六进制值总是被视为无符号值,即使符号类型可以通过用于存储它们的数据类型来推断呢?

如何在不诉诸ushortuintulong的情况下将这些位存储到这些数据类型中?

特别是,考虑到我不能使用更大的签名数据类型,如何才能为long数据类型实现此目的?

2 个答案:

答案 0 :(得分:5)

正在发生的是文字本质上是打字的。 0.1double,这就是为什么你不能说float f = 0.1。您可以投射 doublefloatfloat f = (float)0.1),但您可能会失去精确度。类似地,文字0xFFFFFFFF本质上是uint。您可以将其强制转换为int,但之后的已被编译器解释为uint。编译器不使用您为其分配的变量来确定其类型;它的类型由它是什么类型的文字来定义。

答案 1 :(得分:0)

它们被视为无符号数字,因为它是what the language specification says to do