2015-01-14 1 views
1

Так что у меня странная проблема. Чем это вызвано этим?Проблема memcpy, преобразующая отрицательные значения из int8_t в 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 | скопировано a: 128.

Все отрицательные значения, похоже, имеют эту проблему. Я хочу использовать memcpy, так что я должен сделать, чтобы сделать эту работу?

+4

Вы не можете использовать 'memcpy' для копирования 8-битного значения в 16-битное значение. Перестань пытаться. –

+0

Разве это не больший тип? – bge0

+1

Да, но 'memcpy' не делает никаких преобразований - он просто копирует байты. Битовая диаграмма вывода будет идентична входу, но в этом случае вы используете два типа, которые интерпретируют это значение по-разному. –

ответ

2

Вы можете посмотреть на это так:

Пусть «а» (16 бит) принимает адрес (байт) 1000, 1001, и инициализируется до 0. Предположим, «Ъ» (8 бит) принимает адрес 2000.

Затем перед:

  00000000 00000000   10000000 
address: 1000  1001   ... 2000 

После тетсру

  10000000 00000000   10000000 
address: 1000  1001   ... 2000 

Который (предполагая, что общий небольшой Endian арку) переводит +128, поскольку операция чтения производится на 16 бит, а не 8.

-128 будет выглядеть следующим образом из-за знак расширения (небольшой Endian):

  10000000 11111111 
address: 1000  1001 
Смежные вопросы