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

Nic*_*ler 1 c# hex unsigned signed types

首先,这个问题有相关帖子: 为什么Int32最大值是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).
Run Code Online (Sandbox Code Playgroud)

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


例如,我预计:

int c = 0xFFFFFFFF;
Run Code Online (Sandbox Code Playgroud)

存储值:

-1
Run Code Online (Sandbox Code Playgroud)

而不是价值:

4294967295
Run Code Online (Sandbox Code Playgroud)

仅仅因为int签名类型.


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

我怎么能存储这些位转换成这些数据类型,而不诉诸使用ushort,uintulong

特别是,long考虑到我不能使用更大的签名数据类型,我怎样才能实现数据类型?

adv*_*v12 5

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