Enviar y Recibir valores grandes en bus CAN

Hola

Necesito pasar unos valores grandes por can bus y recibirlos. Ambos en arduino.

Estoy utilizando la libreria de Seed Studio

Son valores que paso son en formato int32_t
Por ejemplo, la altitud dada por un gps en pies es de 18000.45 ft, yo tendría que pasar 1800045, o unas coordenadas gps, por ejemplo -83.481029, 179.950935 que tendría que pasar como -83481029, 179950935

Mi duda es como meter en un array de char de 8 bytes y como leerlo. He hecho unas pruebas, pero no logro entender como hacerlo, me cuesta entender los operadores bitwise << >>, he leido documentación, tutoriales, pero no acabo de entenderlo ni como aplicarlo a mi problema.

Valores pequeños los logro mandar y recibir, son los valores de hasta 255, no así los grandes.

Adjunto los códigos de pruebas para mandar y recibir.

//Send Code

#include <mcp_can.h>
#include <SPI.h>

const int SPI_CS_PIN = 10;
MCP_CAN CAN(SPI_CS_PIN);   

unsigned char canMsgAlt[8] = {0, 0, 0, 0, 0, 0, 0, 0};

int32_t altData = 1800045;

void setup() {
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS)) {            // init can bus : baudrate = 500k
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}

void loop() {

    canMsgAlt[0] = altData;
    canMsgAlt[1] = altData >> 8;
    canMsgAlt[2] = altData >> 16;
    CAN.sendMsgBuf(321, 0, 3, canMsgAlt);

    Serial.println(altData);//Print for debug

}
//Receive and print code

#include <SPI.h>
#include "mcp_can.h"

const int SPI_CS_PIN = 10;

MCP_CAN CAN(SPI_CS_PIN);                                    // Set CS pin

void setup() {
    Serial.begin(115200);

    while (CAN_OK != CAN.begin(CAN_500KBPS)) {            // init can bus : baudrate = 500k
        Serial.println("CAN BUS Shield init fail");
        Serial.println(" Init CAN BUS Shield again");
        delay(100);
    }
    Serial.println("CAN BUS Shield init ok!");
}


void loop() {
    unsigned char len = 0;
    unsigned char buf[8];
   
    if (CAN_MSGAVAIL == CAN.checkReceive()) {         // check if data coming
        CAN.readMsgBuf(&len, buf);    // read data,  len: data length, buf: data buf

        if (CAN.getCanId()== 321){
            float altitude = (buf[0])|(buf[1]<<8)|(buf[2]<<16);
            Serial.print("Altitude: ");
            Serial.println(altitude/100);
        }

       
    }
}