有没有大佬帮帮我 我看不懂

qq_44798655 2019-05-17 09:19:30
题目所给的给的代码都是在linux gcc上编译运行的呜呜呜呜我是真的搞不懂啊
...全文
181 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_44798655 2019-05-17
  • 打赏
  • 举报
回复
引用 5 楼 打杂的9527 的回复:
第一张图应该是涉及了%x的隐式转换,还有-1的存储形式

char c= -1;
//c -> 11111111
//char是8位
这里猜测%x应该是将char或者unsigned char转化为int(32位)然后进行输出,所以显示的是ffffffff,而%d应该是没有进行相应的转化直接输出了 具体的需要自己查一下,毕竟我不会去关注这种转化的,感觉不实用,有可能导致其他问题。 第二题涉及结构体的内存对齐

//sizeof char -> 1
//sizeof int -> 4
//sizeof short -> 2
//但是sizeof node -> 12
//为什么是12,因为结构体的顺序为char,int,short,因为要对齐,你不能让int跟char对齐,数据必须保持完整,所以char应该要占4位,跟int一致,同理,short也需要对齐int
//内存格式应该是01 00 00 00-02 00 00 00-03 00 00 00,01后面的数据是无意义的,03 00后面的数据也是无意义的
//当然如果你换一个位置结果就会不同了,比如node的顺序为int,char,short,那么sizeof node -> 8,具体的自己搜了,以上只是我自己记忆中的理解
//这就是内存对齐的结果
//同理sizeof n -> 8
//初始化后,我们就可以直接将a的内存写出来了,这里我就不写了
//01 00 00 00-02 00 00 00 00-03 00 00 00-04 00 00 00-05 00 00 00-06 00 00 00
//char*表示一位一位的移动,所以(char*)a + 2*8 的指针指向05,
//然后又把指针强制转换为int类型,所以指向的就是05 00 00 00
//最后结果就是把5设置为100了
第四题考的是long和int在内存中的存储方式

//没啥好说的内存应该是78 69 79 6f 75 4c 69 6e-75 78 00 00
//倒着存的
//&num->取num的首地址,(char*)&num,取num的首地址,强制转换为char*的类型,+i表示向后偏移多少个字节量,比如+2就应该指向79
ps:linux上的c编程不熟,不保证一定对
多谢大佬嗷
qq_44798655 2019-05-17
  • 打赏
  • 举报
回复
第一个题书出来的结果是ffffffff ffffffff 255为啥啊
qq_44798655 2019-05-17
  • 打赏
  • 举报
回复
引用 1 楼 neu_ZZM 的回复:
问问题好歹说自己哪个点不会,哪有一下扔一大堆图上来的
第二张图main函数里面第二个语句 char*a指向的是{1,2,3}还是啥 这一整个语句是啥意思啊
qq_44798655 2019-05-17
  • 打赏
  • 举报
回复
第四张图ch =*((char*)&num +i)这个语句是啥意思
neu_ZZM 2019-05-17
  • 打赏
  • 举报
回复
问问题好歹说自己哪个点不会,哪有一下扔一大堆图上来的
打杂的9527 2019-05-17
  • 打赏
  • 举报
回复
第一张图应该是涉及了%x的隐式转换,还有-1的存储形式

char c= -1;
//c -> 11111111
//char是8位
这里猜测%x应该是将char或者unsigned char转化为int(32位)然后进行输出,所以显示的是ffffffff,而%d应该是没有进行相应的转化直接输出了 具体的需要自己查一下,毕竟我不会去关注这种转化的,感觉不实用,有可能导致其他问题。 第二题涉及结构体的内存对齐

//sizeof char -> 1
//sizeof int -> 4
//sizeof short -> 2
//但是sizeof node -> 12
//为什么是12,因为结构体的顺序为char,int,short,因为要对齐,你不能让int跟char对齐,数据必须保持完整,所以char应该要占4位,跟int一致,同理,short也需要对齐int
//内存格式应该是01 00 00 00-02 00 00 00-03 00 00 00,01后面的数据是无意义的,03 00后面的数据也是无意义的
//当然如果你换一个位置结果就会不同了,比如node的顺序为int,char,short,那么sizeof node -> 8,具体的自己搜了,以上只是我自己记忆中的理解
//这就是内存对齐的结果
//同理sizeof n -> 8
//初始化后,我们就可以直接将a的内存写出来了,这里我就不写了
//01 00 00 00-02 00 00 00 00-03 00 00 00-04 00 00 00-05 00 00 00-06 00 00 00
//char*表示一位一位的移动,所以(char*)a + 2*8 的指针指向05,
//然后又把指针强制转换为int类型,所以指向的就是05 00 00 00
//最后结果就是把5设置为100了
第四题考的是long和int在内存中的存储方式

//没啥好说的内存应该是78 69 79 6f 75 4c 69 6e-75 78 00 00
//倒着存的
//&num->取num的首地址,(char*)&num,取num的首地址,强制转换为char*的类型,+i表示向后偏移多少个字节量,比如+2就应该指向79
ps:linux上的c编程不熟,不保证一定对

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧