【问题标题】:memcpy issue converting negative values from int8_t to int16_t将负值从 int8_t 转换为 int16_t 的 memcpy 问题
【发布时间】:2015-03-12 23:24:31
【问题描述】:

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

#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,那么我应该怎么做才能使它工作?

【问题讨论】:

  • 您不能使用memcpy 将 8 位值复制到 16 位值。别再尝试了。
  • 不是更大的类型吗?
  • 是的,但是memcpy 不进行任何转换——它只是复制字节。输出的位模式将与输入相同,但在这种情况下,您使用的两种类型会以不同方式解释该值。
  • 谷歌搜索“签名扩展”

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


【解决方案1】:

你可以这样看:

假设“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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-07
    • 1970-01-01
    • 1970-01-01
    • 2015-09-22
    相关资源
    最近更新 更多