社区
C语言
帖子详情
关于指针类型的强制转换
yellowfish1
2013-09-07 09:05:15
为什么输出结果会是 000000f7和fffffff7
第一个我知道为什么,第二个就不清楚了
虽然指针b指向的是a的内存单元,但是指针b是char类型的指针,解引用得到的应该是个char型的1个字节才对啊
...全文
341
7
打赏
收藏
关于指针类型的强制转换
为什么输出结果会是 000000f7和fffffff7 第一个我知道为什么,第二个就不清楚了 虽然指针b指向的是a的内存单元,但是指针b是char类型的指针,解引用得到的应该是个char型的1个字节才对啊
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
lm_whales
2013-09-10
打赏
举报
回复
搞错了是 add esp,12
lm_whales
2013-09-10
打赏
举报
回复
a =0xFFFFFFF7; i =0xF7; *b=0xF7; printf("%08x,%08x",i,*b); //汇编代码 push 0xFFFFFFF7 //*b =push (int) *b push 0x000000F7 //i =push (int)i push fmt //"%08x,%08x" call printf sub esp,12 printf("%08x,%08x",i,*b); =printf("%08x,%08x",(int)i,(int)*b); char,short 压栈时,要转换成int 类型, 函数参数没有真正的, char,short,float 一律是 int,double char,short 不过是定义变量,和编写程序用的,参数传递时, 是不会有char,short,float存在的
FengPrince
2013-09-09
打赏
举报
回复
因为C标准规定,对于变长参数类型,传递进去的参数要进行默认参数提升,即整数提升和将float转double。 所以,当你将*b传给printf函数时,编译器会作(int)*b的转换,所以你看到的就是4个字节而非1个字节! 再给你举个熟悉的例子,printf("%f\n",f),f既可以是float类型也可以是double类型,但都使用%f,为什么?就是因为默认参数提升,无论f是什么类型,传进去后都变成double类型。
cao_julians
2013-09-09
打赏
举报
回复
0xf7(十六进制)的二进制表示是1111 0111. 最左一个‘1’作何解释取决于数据类型,unsigned char是无符号字符类型,最左的‘1’是数值的一部分。 char是有符号字符类型,最左的‘1’被确定为补码的符号‘-’。 1.LZ应该先测试这个‘0xf7'的数值----按%u和%d格式输出 2.然后再去理解负数的表示,一个字节和四个字节的转换规则----由一个字节的负数变换为四个字节时,左边用三个字节的全’1‘填写----“符号扩展”----用表示’负‘的’1‘去扩展。把正数的变换规则合在一起就是“符号扩展”
赵4老师
2013-09-09
打赏
举报
回复
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构…… 对学习编程者的忠告: 眼过千遍不如手过一遍! 书看千行不如手敲一行! 手敲千行不如单步一行! 单步源代码千行不如单步对应汇编一行! VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。 对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。 (Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
悦来客栈的老板
2013-09-08
打赏
举报
回复
char* b指向的是存储0xf7的内存单元, 而你输出的格式是%08x,也就是将0xf7扩充为一个8个字节的数打印输出, char *b,指向是数是有符号数,在扩充时需要字节填充。 楼主可以试试将char *b 换成 unsigned char* b看看打印输出什么。你就明白了
AnYidan
2013-09-07
打赏
举报
回复
google 符号扩展
基于YOLOv5工地上安全帽佩戴的检测源码+训练好模型+数据集.zip
YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明 YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明YOLO高分设计资源源码,详情请查看资源内容中使用说明
2011管理类联考199综合能力全国硕士研究生招生考试解析.pdf
考研管理类联考综合能力答案解析,考研真题,考研历年真题,考研管理类联考历年真题,真题解析。
NIUCLOUD-ADMIN 是一款快速开发SaaS通用管理系统后台框架.zip
springboot框架 一、Spring Boot基础应用 Spring Boot特征 概念: 约定优于配置,简单来说就是你所期待的配置与约定的配置一致,那么就可以不做任何配置,约定不符合期待时才需要对约定进行替换配置。 特征: 1. SpringBoot Starter:他将常用的依赖分组进行了整合,将其合并到一个依赖中,这样就可以一次性添加到项目的Maven或Gradle构建中。 2,使编码变得简单,SpringBoot采用 JavaConfig的方式对Spring进行配置,并且提供了大量的注解,极大的提高了工作效率,比如@Configuration和@bean注解结合,基于@Configuration完成类扫描,基于@bean注解把返回值注入IOC容器。 3.自动配置:SpringBoot的自动配置特性利用了Spring对条件化配置的支持,合理地推测应用所需的bean并自动化配置他们。 4.使部署变得简单,SpringBoot内置了三种Servlet容器,Tomcat,Jetty,undertow.我们只需要一个Java的运行环境就可以跑SpringBoot的项目了
2024-2030全球及中国冷冻有机毛豆行业研究及十五五规划分析报告.docx
2024-2030全球及中国冷冻有机毛豆行业研究及十五五规划分析报告
SpringBoo车险理赔源码.rar
SpringBoo车险理赔源码.rarSpringBoo车险理赔源码.rarSpringBoo车险理赔源码.rar
C语言
69,371
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章