指针和数组的千丝万缕(三)

本文探讨了在x86架构的小端模式下,如何解析通过特定方式访问的数组数据。通过实例演示了如何将char数组转换为int和short类型的数据,并解释了这些操作背后的原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

假设在x86(小端)上运行以下代码:
char undata[100];
short out,i;
for(i=0; i<100; i++)
    undata[i] = i;
out = *(short*)((int*)undata + 1);

咋一看最后一句,还真是有点晕,一会儿int*,一会儿short*不过仔细分析以下,还是有头绪的。
话说执行完for循环之后,数组undata的值就变为0,1,2,3,4,5,6,......97,98,99;每一个元素均占用一个(char)字节大小。(int*)undata是把这100个数字在整合成以int类型的数组,就是把0,1,2,3整合为一个数组来访问,4,5,6,7整合为一个数组来访问,一次类推,而内存里的数是不变的,只是编译器在访问的时候均已一个int类型大小的跨度来访问,那么可以看成(100/4)25个int类型的元素了。
在CPU=x86,OS=winxp,compiler=mingw32,通过GDB调试下来验证。

这里undate的地址为0x22ff08,下面的调试显示了一切!


还有记住在x86的架构里,数据均已小端的方式存储的,就是我常提到的“小低低(弟弟)”,且看下面:

数据

D

00000000

10000000

01000000

11000000

00100000

10100000

01100000

11100000

00010000

B

0

1

2

3

4

5

6

7

8

 

address

0x22ff08

0x22ff09

0x22ff0a

0x22ff0b

0x22ff0c

0x22ff0d

0x22ff0e

0x22ff0f

0x22ff10

 

 

int

int

 

 

 

short

 

 

short

 

 

 

然后out=0000 0101 0000 0100 = 2^10+2^8+2^2 = 1284

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值