请教一个高深而基础的C问题
答案:1 悬赏:0 手机版
解决时间 2021-02-19 06:25
- 提问者网友:世勋超人
- 2021-02-19 01:39
请教一个高深而基础的C问题
最佳答案
- 五星知识达人网友:你哪知我潦倒为你
- 2021-02-19 02:07
1. Windows的存储时little-endian的方式。低字节存在低地址。
比如32位数据0x11223344,在内存中从低地址从高地址存储为: 0x44 0x33 0x22 0x11.
2. union共用地址。假设"unit bt c", c的地址是0x00100000, 那么c的成员的地址为:
a : 0x00100000~0x00100003
b[0] : 0x00100000
b[1] : 0x00100001
3. int一般是32位的。
当"p->a = 7"的时候,内存中存储的数据为(从低地址到高地址addr0~addr3):
0x07 0x00 0x00 0x00
"p->b[0]=9;"把addr0的数据改为0x09.
"p->b[1]=8;"把addr1的数据改为0x08.
所以经过"f(&c)"之后数据变为 0x09 0x08 0x00 0x00.
所以c.a = 0x809, 也就是2057.
同理,当"p->a = -7"的时候,内存中存储的数据为:
( int -7 = 0xFFFFFFF9 )
0xF9 0xFF 0xFF 0xFF.
经过"f(&c)"之后变为:
0x09 0x08 0xFF 0xFF.
所以c.a = 0xFFFF0809, 也就是-63479.
另外: -7 + -7, 也就是0xFFFFFFF9 + 0xFFFFFFF9, 得到是0x1FFFFFFF2,但是因为32位的限制,截短为0xFFFFFFF2, 也就是-14.
比如32位数据0x11223344,在内存中从低地址从高地址存储为: 0x44 0x33 0x22 0x11.
2. union共用地址。假设"unit bt c", c的地址是0x00100000, 那么c的成员的地址为:
a : 0x00100000~0x00100003
b[0] : 0x00100000
b[1] : 0x00100001
3. int一般是32位的。
当"p->a = 7"的时候,内存中存储的数据为(从低地址到高地址addr0~addr3):
0x07 0x00 0x00 0x00
"p->b[0]=9;"把addr0的数据改为0x09.
"p->b[1]=8;"把addr1的数据改为0x08.
所以经过"f(&c)"之后数据变为 0x09 0x08 0x00 0x00.
所以c.a = 0x809, 也就是2057.
同理,当"p->a = -7"的时候,内存中存储的数据为:
( int -7 = 0xFFFFFFF9 )
0xF9 0xFF 0xFF 0xFF.
经过"f(&c)"之后变为:
0x09 0x08 0xFF 0xFF.
所以c.a = 0xFFFF0809, 也就是-63479.
另外: -7 + -7, 也就是0xFFFFFFF9 + 0xFFFFFFF9, 得到是0x1FFFFFFF2,但是因为32位的限制,截短为0xFFFFFFF2, 也就是-14.
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯