在恒定值计算中获得溢出

时间:2016-03-07 17:00:38

标签: c#-4.0

以下代码:

private const uint FIRMWARE_DOWNLOAD_ADDRESS = 0x00001800;

public void someFunc(){
    byte[] command = new byte[16];


    command[11] = (byte)(FIRMWARE_DOWNLOAD_ADDRESS >> 24);
    command[10] = (byte)(FIRMWARE_DOWNLOAD_ADDRESS >> 16);
    command[9] = (byte)(FIRMWARE_DOWNLOAD_ADDRESS >> 8);
    command[8] = (byte)(FIRMWARE_DOWNLOAD_ADDRESS); //error: Overflow in constant value computation
}

抛出错误Overflow in constant value computation

为什么呢?根据我的理解0x00001800< = 0xffffffff,所以不应发生溢出。

为什么其他3行不会抛出错误?我试着这样做:

command[8] = (byte)(FIRMWARE_DOWNLOAD_ADDRESS >>0);

认为右移位运算符以某种方式检查溢出条件,但这仍然会产生相同的错误。

1 个答案:

答案 0 :(得分:1)

您收到错误,因为您尝试强制转换为byte的值无法用字节表示。

byte的{​​{3}}为0x000000FF(或255)。但是你想要施放0x00001800(或6144)。一个字节根本不能包含该值。

其余的工作正常,因为在位移后,该值足够小,可以用字节

表示
FIRMWARE_DOWNLOAD_ADDRESS >> 24 = 0
FIRMWARE_DOWNLOAD_ADDRESS >> 16 = 0
FIRMWARE_DOWNLOAD_ADDRESS >> 8  = 24

好像你在考虑一个无符号整数max value,即0xFFFFFFFF(或4294967295)