memcpy 将负值从 int8_t 转换为 int16_t 的问题

memcpy issue converting negative values from int8_t to int16_t

所以我遇到了一个奇怪的问题。到底是什么原因造成的?

#include <inttypes.h>
#include <stdio.h>
#include <string.h>

int main()
{
    int16_t a = 0;
    int8_t b = 0;
    b = INT8_MIN;

    void* a_ptr = &a;
    void* b_ptr = &b;
    memcpy(a_ptr,b_ptr,sizeof(int8_t));
    printf("min b: %d | copied a: %d", b, a);
}

结果是:最小b:-128 |复制了一个:128.

所有的负值似乎都有这个问题。 我想使用 memcpy,那么我应该怎么做才能让它工作?

你可以这样看:

假设"a"(16位)取1000、1001的地址(字节),初始化为0。 假设"b"(8位)取地址2000.

然后之前:

         00000000 00000000           10000000
address: 1000     1001         ...   2000

memcpy 之后

         10000000 00000000           10000000
address: 1000     1001         ...   2000

其中(假设通用的小端架构)转换为 +128,因为读取操作是在 16 位而不是 8 位上进行的。

由于符号扩展(小端),-128 看起来像这样:

         10000000 11111111
address: 1000     1001