Если у вас есть что-то подобное,
int k = 1683 ;
int *l = &k;
Если Вы разыменования указателя l
, то он будет читать правильно целочисленные байты. Потому что вы объявили его указателем на int
. Он будет знать, сколько байтов считывается оператором sizeof()
.Как правило, размер int
является 4 bytes
(для 32/64-битных платформ), но это зависит от машины, поэтому он будет использовать sizeof()
оператору знать правильный размер и будет читать так .Теперь для кода
int k = 1683;
char *a = &k;
int *l = &k;
Теперь pointer p
указывает на y
, но мы объявили его указателем на char
, поэтому он будет читать только один байт или любой другой байтовый символ. 1683
в двоичной системе будет представлена как
00000000 00000000 00000110 10010011
Теперь, если ваша машина мало младшему будет хранить байты реверсирования их
10010011 00000110 00000000 00000000
10010011
находится в address 00
Hypothetical address
, 00000110
находится в address 01
и так далее.
BE: 00 01 02 03
+----+----+----+----+
y: | 00 | 00 | 06 | 93 |
+----+----+----+----+
LE: 00 01 02 03
+----+----+----+----+
y: | 93 | 06 | 00 | 00 |
+----+----+----+----+
(In Hexadecimal)
Так что теперь, если вы разыменования pointer a
он будет читать только первый байт и выход будет -1
, как прочитанный байт будет 10010011
(Потому что мы указали signed char
, поэтому most-significant bit
бит знака. Первый бит 1
означает знак 10010011 = –128 + 16 + 2 + 1 = –109
.), И если вы разыскиваете pointer l
, он полностью прочитает все байты int
, так как мы объявили его указателем на int. И выход будет 1234
А также, если вы объявите указатель л, как int *l
то *l
прочтет sizeof(int)
обычно 4 bytes
(в зависимости от архитектуры машины) и *(l+1)
также прочтет, что многие байт. То же самое происходит с char
или любым другим типом данных, указатель, на который они указывают, будет считывать столько байтов, размер которых равен, char
составляет 1 byte
.
Thats из-за преобразования указателя на int для указателя на символ. Обратите внимание, что целое число равно 4 байтам, а char - 1-байтовая длина. – Gravell
Что вы ожидали? – Stargateur
Можете ли вы шаг за шагом объяснить мне, почему это происходит -109. –