2016-12-08 51 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

假设你是一个小端系统上工作:

int a = 258 

它代表一个十六进制4字节数,0x00000102

char *b = &a; 

做一个指向一个字节大小的数据类型,所以它只指向最后一个0x02

b++; 

将指针1个字节,现在它指向0×01

*b = 2; 

更改您的int从地址0x01为0x02 现在你有a

a = 0x00000202 = 514 
+1

此答案假定整数存储在[little endian](https:/ /en.wikipedia.org/wiki/Endianness)符号(这可能**是海报计算机上的实际字节顺序,只要它们得到结果)。 – axiac

2

觉得作为数组第二个字节字节(char)与sizeof(int)元素。

随着

char *b = &a; 

你让b指向此数组中的第一个元素。

然后你做b++这使得b指向第二个元素。然后给第二个元素赋值,这会修改a的值。

另请注意,结果取决于您的系统的字节顺序上的

5

258看起来像00000000 00000000 00000001 00000010(在小端)。

然后您将b指向00000010的“第一个char”。

现在你增加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;,B将指向从右边的第一个字节是00000010

当你做b++;时,假设你的机器中char是1个字节,b值加1,现在它指向右边第二个字节,即00000001.

现在你做*b =2;。所以第二个字节将变成00000010

所以,如果你看到,a,它会是这样的。

00000000 00000000 00000010 00000010 

哪个是512

-1

整数型“B”变量的第二个字节将被增加作为变量是字符类型的。您的答案将更改为514

相关问题