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