2016-12-08 3 views

ответ

2

Учитывая 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.

0

Предполагая, что вы работаете на маленькой системе Endian:

int a = 258 

Ряд 4 байт, который представляет в Hex 0x00000102

char *b = &a; 

Сделайте указатель на один размер байта, поэтому он указывает только на последние 0x02

b++; 

Переместить указатель на 1 байт, теперь он указывает на 0х01

*b = 2; 

Измените второй байт ИНТ от 0x01 до 0x02 Теперь у вас есть

a = 0x00000202 = 514 
+1

Этот ответ предполагает, что целые числа хранятся в [little endian] (https://en.wikipedia.org/wiki/Endianness) (который, вероятно, ** является ** фактическим байтовым порядком на компьютере плаката, учитывая полученные результаты). – axiac

2

Думают о a как массив байты (char) с sizeof(int) элементов.

С

char *b = &a; 

вы делаете b точку на первый элемент в этом массиве.

Затем вы делаете b++, который составляет b, указывая на второй элемент. Затем вы присваиваете значение этому второму элементу, который изменит значение a.

Также обратите внимание, что результаты зависят от очень много на байте-порядке вашей системы.

5

258 будет выглядеть примерно как 00000000 00000000 00000001 00000010 (на малоэтажном).

Затем вы делаете b указывают на "первые char", который является 00000010.

Теперь увеличивает b, потому что это типа char теперь переходит к следующей адресуемой char, который 00000001 («второй» элемент), а затем изменить его 2, который 00000010.

Итак, теперь у нас есть 00000000 00000000 00000010 00000010, что составляет 514 при чтении как int.

Этот результат не гарантируется, хотя, как и в случае с big-endian, результат будет отличаться в целом.

+2

Этот ответ предполагает, что целые числа хранятся в записи [little endian] (https://en.wikipedia.org/wiki/Endianness) (которая, вероятно, ** является ** фактическим байтовым порядком на компьютере плаката, учитывая результаты они получают). – axiac

+1

[C++ * "proof" *] (http://melpon.org/wandbox/permlink/FQhUdebvexmt5PkO) –

+1

@axiac Да, я добавил это для ясности, спасибо. –

0
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.

-1

целочисленный тип «B» второго байта переменной будет увеличиваться, поскольку переменная имеет тип полукокса. И ваш ответ изменится на 514

Смежные вопросы