首先,这个问题有相关的帖子:
  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数据类型实现此目标?

最佳答案

发生的是文字是固有类型的。 0.1double,这就是为什么您不能说float f = 0.1的原因。您可以将double强制转换为floatfloat f = (float)0.1),但是可能会失去精度。同样,文字0xFFFFFFFF本质上是一个uint。您可以将其强制转换为int,但这是在编译器将其解释为uint之后。编译器不会使用您为其分配的变量来确定其类型;它的类型由它的字面量定义。

关于c# - 无法将32位十六进制值分配给整数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34424880/

10-11 21:32