#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
Значение a составляет 514, но я не уверен, как ?!Можете ли вы объяснить мне вывод следующего кода C?
#include<stdio.h>
int main()
{
int a = 258;
char *b = &a;
b++;
*b =2;
printf("%d",a);
return 0;
}
Значение a составляет 514, но я не уверен, как ?!Можете ли вы объяснить мне вывод следующего кода C?
Учитывая 32 бит 2 дополнением системы, переменная a
может храниться в следующих случаях (шест):
02 01 00 00 // little endian, or
00 00 01 02 // big endian
Вы указываете на первый байт этого числа, затем увеличиваем указатель на 1 . В маленькой системной системе вы теперь укажете на значение 01
и в системе с большим эндисом вы теперь укажете на значение 00
.
Кажется, у вас есть маленькая система, так как вы меняете значение 01
на 02
и заставляете память выглядеть как 02 02 00 00
. Переводя это десятичное число даст вам 514.
Предполагая, что вы работаете на маленькой системе Endian:
int a = 258
Ряд 4 байт, который представляет в Hex 0x00000102
char *b = &a;
Сделайте указатель на один размер байта, поэтому он указывает только на последние 0x02
b++;
Переместить указатель на 1 байт, теперь он указывает на 0х01
*b = 2;
Измените второй байт ИНТ от 0x01 до 0x02 Теперь у вас есть
a = 0x00000202 = 514
Этот ответ предполагает, что целые числа хранятся в [little endian] (https://en.wikipedia.org/wiki/Endianness) (который, вероятно, ** является ** фактическим байтовым порядком на компьютере плаката, учитывая полученные результаты). – axiac
Думают о a
как массив байты (char
) с sizeof(int)
элементов.
С
char *b = &a;
вы делаете b
точку на первый элемент в этом массиве.
Затем вы делаете b++
, который составляет b
, указывая на второй элемент. Затем вы присваиваете значение этому второму элементу, который изменит значение a
.
Также обратите внимание, что результаты зависят от очень много на байте-порядке вашей системы.
258
будет выглядеть примерно как 00000000 00000000 00000001 00000010
(на малоэтажном).
Затем вы делаете b
указывают на "первые char
", который является 00000010
.
Теперь увеличивает b
, потому что это типа char
теперь переходит к следующей адресуемой char
, который 00000001
(«второй» элемент), а затем изменить его 2
, который 00000010
.
Итак, теперь у нас есть 00000000 00000000 00000010 00000010
, что составляет 514
при чтении как int
.
Этот результат не гарантируется, хотя, как и в случае с big-endian, результат будет отличаться в целом.
Этот ответ предполагает, что целые числа хранятся в записи [little endian] (https://en.wikipedia.org/wiki/Endianness) (которая, вероятно, ** является ** фактическим байтовым порядком на компьютере плаката, учитывая результаты они получают). – axiac
[C++ * "proof" *] (http://melpon.org/wandbox/permlink/FQhUdebvexmt5PkO) –
@axiac Да, я добавил это для ясности, спасибо. –
int a = 258;
Предполагая INT имеет длину 4 байта в вашей машине, он будет храниться в
00000000 00000000 00000001 00000010
Когда вы char *b = &a;
, б будет указывать на первый байт справа, который 00000010.
Когда вы b++;
предполагая, символ 1 байт в вашей машине, значение б увеличивается на 1, и теперь он указывает на 2-й байт справа, который 00000001.
Теперь вы делаете *b =2;
. Итак, 2-й байт станет 00000010
.
Итак, если вы видите, a
, это будет так.
00000000 00000000 00000010 00000010
Который 512.
целочисленный тип «B» второго байта переменной будет увеличиваться, поскольку переменная имеет тип полукокса. И ваш ответ изменится на 514
258 = 1 * 256 + 2. 514 = 2 * 256 + 2. Вы изменили значение 1 на 2. –