Переполнение при смещении C

Привет, я пытаюсь объединить 2 uint32_t, чтобы сделать 64-битное сообщение для отправки через сокет. Но я получаю следующую ошибку warning: left shift count >= width of type [-Wshift-count-overflow] uint64_t mensaje = (random_number << 32) | mensaje_temp; Вот пример кода:

void send_msg(int num, int connsocket){
    uint8_t largo = 6;
    uint8_t type = 11;
    uint16_t filler = 0;
    uint32_t random_number = num;
    uint16_t second_part = (type << 8) | largo;
    uint32_t mensaje_temp = (filler << 16) | second_part;
    uint64_t mensaje = (random_number << 32) | mensaje_temp;
    size_t msg_length = 8;
    char *new_msg = (char*)&mensaje;
}

Я только что сделал то же самое, чтобы объединить типы uint8_t с похожим кодом, и это сработало. Любые советы о том, как безопасно манипулировать данными этого типа, были бы замечательными.


person Polo D. Vargas    schedule 07.06.2017    source источник
comment
Вам нужно явно преобразовать в более широкий тип до сдвига влево, например. mensaje = (((uint64_t) random_number) << 32) | mensaje_temp; Аналогично. если вы идете другим путем, убедитесь, что конвертируете в более узкий тип после сдвига вправо.   -  person zwol    schedule 07.06.2017
comment
Спасибо! это сработало, что вы подразумеваете под более узким типом, я не знаком с концепцией: S   -  person Polo D. Vargas    schedule 08.06.2017
comment
Тип уже, если в нем меньше битов значения, и шире, если больше. Вот и все.   -  person zwol    schedule 08.06.2017