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
所以我遇到了一个奇怪的问题。到底是什么原因造成的?
#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