C++ &引用;从';uint8&x27;至';uint16';“失去精度”;为STM32编译时

C++ &引用;从';uint8&x27;至';uint16';“失去精度”;为STM32编译时,c++,casting,arduino,stm32,C++,Casting,Arduino,Stm32,我正在尝试将Arduino以太网库移植到libmaple,以便与设备一起使用。编译时(使用GCC工具链)。我明白了 围绕代码段: void W5100Class::read_data(SOCKET s, uint8_t *src, uint8_t *dst, uint16_t len) { uint16_t size; uint16_t src_ptr; src_mask = (uint16_t)src & RMASK; src_ptr = RBASE[

我正在尝试将Arduino以太网库移植到
libmaple
,以便与设备一起使用。编译时(使用GCC工具链)。我明白了

围绕代码段:

void W5100Class::read_data(SOCKET s, uint8_t *src,  uint8_t *dst, uint16_t len)
{
    uint16_t size;
    uint16_t src_ptr;
    src_mask = (uint16_t)src & RMASK;
    src_ptr = RBASE[s] + src_mask;

    if( (src_mask + len) > RSIZE )
    {
        size = RSIZE - src_mask;
        read(src_ptr, (uint8_t *)dst, size);
        dst += size;
        read(RBASE[s], (uint8_t *) dst, len - size);
    }
    else
        read(src_ptr, (uint8_t *) dst, len);
}

指针类型为32位,因此当您尝试将其分配给16位时,它将丢失数据。

指针类型为32位,因此当您尝试将其分配给16位时,它将丢失数据。

更改
src_mask=(uint16_t)src&RMASK
src_掩码=(0xffff&src)&RMASK
也将满足您的需求。只要按照您的意愿丢弃较高的16位。

更改
src_掩码=(uint16_t)src&RMASK
src_掩码=(0xffff&src)&RMASK
也将满足您的需求。只需根据需要丢弃更高的16位

void W5100Class::read_data(SOCKET s, uint8_t *src,  uint8_t *dst, uint16_t len)
{
    uint16_t size;
    uint16_t src_ptr;
    src_mask = (uint16_t)src & RMASK;
    src_ptr = RBASE[s] + src_mask;

    if( (src_mask + len) > RSIZE )
    {
        size = RSIZE - src_mask;
        read(src_ptr, (uint8_t *)dst, size);
        dst += size;
        read(RBASE[s], (uint8_t *) dst, len - size);
    }
    else
        read(src_ptr, (uint8_t *) dst, len);
}