Проблема понимания вывода программы на C - PullRequest
2 голосов
/ 22 января 2011

У меня есть следующая программа:

#include<stdio.h>
int main()
{
int i =257;
int *iptr =&i;
printf("%d%d",*((char*)iptr),*((char*)iptr+1));
return 0; 
}

Вывод:

1 1

Я не могу понять, почему второе значение 1. Пожалуйста, объясните.

Ответы [ 3 ]

6 голосов
/ 22 января 2011

По той же причине, по которой выходит первое значение 1. Вы получаете доступ к одному байту за раз из int.Так как 257 равен 0x0101, каждый из двух младших байтов содержит значение 1.

Возможно, ваш int имеет длину 4 байта и хранится с прямым порядком байтов, хотя я предполагаю, что он может быть длиной 2 байта с любым порядком байтовНесс.

5 голосов
/ 22 января 2011

Поскольку 257 в двоичном виде - это 00000001 00000001: поэтому первый и второй байты, представляющие его, установлены в 1.

(char*)iptr - это char (то есть 1 байт), обозначенный iptr, а (char*)iptr+1 - следующий байт.

2 голосов
/ 22 января 2011

257 в шестнадцатеричном виде как 4 байта = 0x00000101, который на машинах Intel хранится в памяти как 01 01 00 00. iptr указывает на первый 01, а iptr + 1 на второй.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...