У меня есть эта программа на C:
int main(int argc, char *argv[])
{
int i=300;
char *ptr = &i;
*++ptr=2;
printf("%d",i);
return 0;
}
Вывод 556 с прямым порядком байтов.
Я попытался понять вывод. Вот мое объяснение.
Вопрос: останется ли ответ таким же в машине с обратным порядком байтов?
i = 300; => i = 100101100 //в двоичном виде в формате слова => BB Hb 0001 00101100, где B = байт и Hb = полубайт
(A)=> в памяти (при условии, что это прямой порядок байтов))
0x12345678 - 1100 - 0010 ( Is this correct for little endian)
0x12345679 - 0001 - 0000
0x1234567a - 0000 - 0000
0x1234567b - 0000 - 0000
0x1234567c - Местоположение следующего intezer (расположение ptr++ или ptr + 1, где ptr — указатель на intezer, поскольку ptr имеет тип int => при выполнении ++ptr он будет увеличиваться на 4 байта (размер int))
когда
(B)мы делаем char *ptr = &i; ptr станет типа char => при выполнении ++ptr он будет увеличиваться на 1 байт (размер char) поэтому при выполнении ++ptr он перейдет к местоположению -> 0x12345679 (который имеет 0001 - 0000) сейчас мы делаем ++ptr = 2 => 0x12345679 будет перезаписан на 2 => 0x12345679 будет иметь 00*10** - 0000 вместо 000* 1* - 0000
, поэтому новое содержимое памяти будет выглядеть так:
(C)
0x12345678 - 1100 - 0010
0x12345679 - 0010 - 0000
0x1234567a - 0000 - 0000
0x1234567b - 0000 - 0000
что эквивалентно => BB Hb 0010 00101100, где B = байт и Hb = полубайт
Верны ли мои рассуждения? Есть ли для этого какой-либо другой короткий метод? С уважением, Софти