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

时间:2015-01-14 17:15:29

标签: c type-conversion c99 memcpy memory-alignment

所以我有一个奇怪的问题。是什么造成了这种情况?

#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);
}

结果是:min b:-128 |复制了一个:128。

所有负值似乎都有这个问题。 我想使用memcpy,那么我该怎么做呢?

1 个答案:

答案 0 :(得分:2)

你可以这样看:

假设&#34; a&#34; (16位)获取1000,1001的地址(字节)并将其初始化为0。 假设&#34; b&#34; (8位)取2000的地址。

之前:

         00000000 00000000           10000000
address: 1000     1001         ...   2000

memcpy之后

         10000000 00000000           10000000
address: 1000     1001         ...   2000

其中(假设常见的小端拱)转换为+128,因为读操作是在16位而不是8位。

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

         10000000 11111111
address: 1000     1001
相关问题