Пожалуйста, помогите мне для использования memcpy () в C - PullRequest
2 голосов
/ 22 ноября 2011

У меня следующий код:

void main()
{
    char tmp[3]= "AB";
    short k;
    memcpy(&k,tmp,2);
    printf("%x\n", k);
}

В ASCII шестнадцатеричное значение char 'A' равно 41, а шестнадцатеричное значение char 'B' - 42. Почему результат этой программы4241?Я думаю, что правильный результат 4142.

Ответы [ 3 ]

4 голосов
/ 22 ноября 2011

Вы, очевидно, запускаете это на машине с прямым порядком байтов, где младший байт идет первым. Смотри http://en.wikipedia.org/wiki/Endianness.

1 голос
/ 22 ноября 2011

Ваша платформа хранит менее значимые байты числа при меньших адресах памяти и более значимые байты при старших адресах памяти. Такие платформы называются little-endian платформы.

Однако, когда вы печатаете число, сначала печатаются более значимые цифры, а позже печатаются менее значимые (именно так работает наша повседневная цифровая запись). По этой причине результат выглядит «обращенным» по сравнению с тем, как он хранится в памяти на платформе с прямым порядком байтов.

Если вы компилируете и запускаете одну и ту же программу на платформе big-endian , результат должен быть 4142 (предполагается, что платформа с 2-байтовым short).

P.S. Можно утверждать, что «проблема» в этом случае - это «странность» наших повседневных числовых обозначений: мы пишем числа так, чтобы значение их цифр увеличивалось в направлении справа налево. Это кажется противоречивым в контексте обществ, которые пишут и читают в направлении слева направо. Другими словами, это не обратная память. Это способ, которым мы пишем числа, которые перевернуты.

0 голосов
/ 22 ноября 2011

Ваша система имеет младший порядок.Это означает, что short (16-разрядное целое число) сохраняется с наименьшим значащим байтом первым, за которым следует старший значащий байт.

То же самое касается больших целых чисел.Следующий код приведет к "44434241".

void main() 
{ 
    char tmp[5]= "ABCD"; 
    int k; 
    memcpy(&k,tmp,4); 
    printf("%x\n", k); 
} 
...