C++ &引用;从';uint8&x27;至';uint16';“失去精度”;为STM32编译时
我正在尝试将Arduino以太网库移植到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[
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);
}