Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将uint16和int16合并到int32中,以便在C中进行数据传输_C_Types - Fatal编程技术网

将uint16和int16合并到int32中,以便在C中进行数据传输

将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类型传输索引(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语言中,合并整数类型是一个臭名昭著的问题,因为在整数提升、整数表示和位移位定义的限制方面有着严格的细节

首先,很少有很好的理由将
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;