Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 枚举标志负值_C# - Fatal编程技术网

C# 枚举标志负值

C# 枚举标志负值,c#,C#,得到一个负数(-2147483392) 我不明白为什么它(正确地)强制转换为flagsenum 给定 .NET小提琴 我说的没错,因为这是从COM组件激发的事件原因属性,当转换为enum值时,它转换到的值是正确的(根据该事件)。标志枚举符合COM对象的SDK文档。COM对象是第三方,我无法控制数字,基于接口,它将始终作为INT提供最顶端的位集(在Int32的情况下为31位)表示负数(有关详细信息,请参阅): 结果: 10000000000000000000000100000000 ^

得到一个负数(
-2147483392

我不明白为什么它(正确地)强制转换为flags
enum

给定

.NET小提琴

我说的没错,因为这是从COM组件激发的事件原因属性,当转换为
enum
值时,它转换到的值是正确的(根据该事件)。标志枚举符合COM对象的SDK文档。COM对象是第三方,我无法控制数字,基于接口,它将始终作为INT提供最顶端的位集(在
Int32
的情况下为31位)表示负数(有关详细信息,请参阅):

结果:

  10000000000000000000000100000000
  ^                      ^
  |                      8-th
  31-th
你也是

  -2147483392 == (1 << 31) | (1 << 8) == REASON17 | REASON9

<代码> -2147483392==(1)最高位(<代码>第31版/代码>)集合表示负数,见两个补:为什么不指定EnUM类型而不是让编译器为您做错误的操作。@ JDWEN编译器没有做任何错误。请考虑<代码> Pube EnimeRealNeNUM:长{}如果这让你感到紧张。你可能迟早会不得不这样做,因为你无法再添加其他成员。请澄清,我收到的号码(-2147483392)来自(第三方)COM组件,所以我根本无法控制。我得到的只是一个带原因的int属性,还有一个SDK,它说根据位掩码值检查这个原因。我不确定让enum变长会有什么帮助,可以说它意味着2147483904的值也意味着同样的事情,但如果接口总是给我一个int…..因此,为了清楚起见,这只是一个乘积,在
int
上打开最左边的位,这是一个负位,相当于
int.MinValue
(也就是说,只打开了负标志,所以这两个互补将是所有其他位打开的
int.MaxValue
),这纯粹是因为
enum
的默认数据类型是
INT
@OJay:你说得很对;我不想把第31位作为“负”位(
int32.MinValue==1000…0b
-1==111…1b
时);如果你在
X
中将第31位设为
1
;你会得到一些负值,但不是
-X
好吧,撇开术语上的小假设不谈,我想我很清楚。是的,称之为“负位”可能有点(双关语)误装,可能是twos恭维位?老实说,我不知道有什么意义,负位标志意味着twos恭维被运行……有点多,但更正确?@OJay:确切地说,我们在浮点值中有负(或符号)位,比如
double
float
(这就是为什么与
Int32
不同,我们可以区分负零和正零)。对于
Int32
  int reason = -2147483392;

  string bits = Convert.ToString(reason, 2).PadLeft(32, '0');

  Console.Write(bits);
  10000000000000000000000100000000
  ^                      ^
  |                      8-th
  31-th
  -2147483392 == (1 << 31) | (1 << 8) == REASON17 | REASON9