补码运算符的编译器错误

时间:2016-05-03 11:22:54

标签: c#

我正在使用逻辑AND <input type="checkbox" id="1" value="Value1" onclick="selectOnlyThis(this.id)" /> Option 1 <input type="checkbox" id="2" value="Value1" onclick="selectOnlyThis(this.id)" /> Option 2 <input type="checkbox" id="3" value="Value1" onclick="selectOnlyThis(this.id)" /> Option 3 <input type="checkbox" id="4" value="Value1" onclick="selectOnlyThis(this.id)" /> Option 4和补充&=运算符,并收到奇怪的编译错误。

~

当我将上面的第一个语句更改为以下等效语句时,一切正常。

// Constants
private const byte XML_MATCH_ID         = 0x01;
private const byte XML_MATCH_MAC        = 0x02;
private const byte XML_MATCH_DEFAULT    = (XML_MATCH_ID + XML_MATCH_MAC);

// ...
byte matchingTags = XML_MATCH_DEFAULT;
// ... (reading XML nodes)

// Assume Machine ID doesn't match
matchingTags &= (byte)~XML_MATCH_ID;    // Compiler error: Constant value '-2' cannot be converted to a 'byte'

// Assume MAC Address doesn't match
matchingTags &= (byte)~XML_MATCH_MAC;   // Same compiler error but with "-3"

为什么编译器会抛出此错误?

1 个答案:

答案 0 :(得分:2)

编译器似乎试图将赞美编译为常量。 我得到的编译器错误是&#34;在常量值计算中溢出&#34;

哪个不是那么奇怪。 byteUnsigned 8-bit integer。 (如果您正在寻找Signed 8-bit integer,那么您应该使用sbyte

~XML_MATCH_ID返回int的值-2,该值byte (uint8)无法转换为~XML_MATCH_ID

解决此问题的一种方法是将int存储为临时int temp = ~XML_MATCH_ID; // temp now holds the value "-2" byte temp2 = (byte)temp; // temp2 now holds the value "254" matchingTags &= temp2; 变量,然后执行逻辑AND:

matchingTags &= (byte.MaxValue - XML_MATCH_ID);

或完全避免使用补语运算符:

<bean id="flyway" class="org.flywaydb.core.Flyway" init-method="migrate">
    <property name="baselineOnMigrate" value="true" />
    <property name="dataSource" ref="dataSource" />
</bean>