将uint16和int16合并到int32中,以便在C中进行数据传输
我遇到了一个问题,以int32_t类型传输索引(uint16_t)和数据(int16_t),但我还没有成功 我尝试了以下几点:将uint16和int16合并到int32中,以便在C中进行数据传输,c,types,C,Types,我遇到了一个问题,以int32_t类型传输索引(uint16_t)和数据(int16_t),但我还没有成功 我尝试了以下几点: int32_t buf = (int16_t) data; buf |= ((int32_t idx)<<16); int32_t buf=(int16_t)数据; buf |=((int32_t idx)试试: uint32\u t buf=data&0xffff; buf |=idx在C语言中,合并整数类型是一个臭名昭著的问题,因为在整数提升、整数表示
int32_t buf = (int16_t) data;
buf |= ((int32_t idx)<<16);
int32_t buf=(int16_t)数据;
buf |=((int32_t idx)试试:
uint32\u t buf=data&0xffff;
buf |=idx在C语言中,合并整数类型是一个臭名昭著的问题,因为在整数提升、整数表示和位移位定义的限制方面有着严格的细节
首先,很少有很好的理由将uint16_t
和int16_t
合并到int32_t
中进行传输。应该使用无符号字符*
访问对象的字节并传输字节。通常,使用me可以轻松地将字节收集到缓冲区进行传输mcpy
,相当于使用无符号字符*
复制字节
如果必须将uint16\u t
和int16\u t
合并为int32\u t
,且前者进入高位字节,则执行此操作的标准一致性方法是:
uint32_t temporary = (uint32_t) idx << 16 | (uint16_t) data;
int32_t buf;
memcpy(&buf, &temporary, sizeof buf);
或者,如果可以更改buf
中data
和idx
的顺序,则更简单的解决方案是:
int32_t buf = data * 65536 | idx;
buf
应该是uint32\u t。buf=data&0xffff;
在无符号int
为16位的实现中,这会失败,因为idx
int32_t temporary = 0x8000 <= idx ? idx - 0x10000 : idx;
int32_t buf = temporary << 16 | (uint16_t) data;
int32_t buf = data * 65536 | idx;