Смещение ржавчины влево - PullRequest
       67

Смещение ржавчины влево

1 голос
/ 19 сентября 2019

Я пытаюсь объединить 4 байта в u32, и компилятор сообщает мне, что сдвиг переполнен.Это мой код:

pub fn get_instruction(file: &[u8], counter: usize) {
    let ins = u32::from(file[counter] << 24)
        | u32::from(file[counter + 1] << 16)
        | u32::from(file[counter + 2] << 8)
        | u32::from(file[counter + 3]);
    println!("{:x}", ins);
}

Ответы [ 2 ]

3 голосов
/ 19 сентября 2019

Вы получили приоритет оператора и произвели неверный ответ:

pub fn get_instruction(file: &[u8], counter: usize) {
    let ins = u32::from(file[counter]) << 24
        | u32::from(file[counter + 1]) << 16
        | u32::from(file[counter + 2]) << 8
        | u32::from(file[counter + 3]);
    println!("{:x}", ins);
}

Вы произвели после , пытаясь сдвинуть u8 24 бит, что было вашей проблемой.

1 голос
/ 19 сентября 2019

Нет необходимости самостоятельно вертеть биты - вместо этого можно использовать функцию u32::from_be_bytes():

pub fn get_instruction(file: &[u8], counter: usize) {
    let ins_bytes = <[u8; 4]>::try_from(&file[counter..counter + 4]).unwrap();
    let ins = u32::from_be_bytes(ins_bytes);
    println!("{:x}", ins);
}
...