社区
C语言
帖子详情
关于指针类型的强制转换
yellowfish1
2013-09-07 09:05:15
为什么输出结果会是 000000f7和fffffff7
第一个我知道为什么,第二个就不清楚了
虽然指针b指向的是a的内存单元,但是指针b是char类型的指针,解引用得到的应该是个char型的1个字节才对啊
...全文
345
7
打赏
收藏
关于指针类型的强制转换
为什么输出结果会是 000000f7和fffffff7 第一个我知道为什么,第二个就不清楚了 虽然指针b指向的是a的内存单元,但是指针b是char类型的指针,解引用得到的应该是个char型的1个字节才对啊
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用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 符号扩展
C/C++
指针
类型
强制转换
解析
文章目录
指针
类型
的
强制转换
Three qQ1Q2Q3summary of three Q
指针
变量的空间地址的
强制转换
Q1Q2
指针
类型
的
强制转换
[参考]([https://alleniverson.gitbooks.io/c_programming_language/content/6.%20
指针
/
指针
的强制
类型
转换.html](https://alleniverson.gitbooks.io/c_programming_language/content/6.
指针
/
指针
的强制
类型
转换.html))
C++
指针
类型
间
强制转换
深入理解
指针
类型
间的转换 C++中
指针
的
强制转换
强制
类型
转换(int)、(int&)和(int*)的区别 内存中的地址 地址的本质就是一串0和1的机器代码,内存中的地址没有明确数据
类型
,但地址值有
类型
,以32位编译器为例,内存中的地址是一个32位的整数。无论什么
类型
的
指针
变量,在内存中本质上都是一样的,都是一个整数值的地址值,该地址值可以转换为其他
类型
,比如float或char,但一般不要强转,此时已不再是合法地址而是一个单纯的数据值,除了没有意义外,还会出现数据读取错误(后...
c语言 void**
类型
转换,void
指针
类型
强制转换
如何将一个void*
强制转换
成行
指针
类型
?void*
指针
可以转换成任何
类型
的
指针
。
强制转换
即可,比如 (int *)(void *)p; 假设你的数组有N行M列的int型数据。 int arr[N][M]; int (*p)[M]=arr; 假设pV为一个void型
指针
p=(int (*)[M])pV;c语言的,void
指针
不能++,那该怎么改?#include #include void a...
c语言中
指针
类型
的强制
类型
转换
对
指针
类型
数据进行强制
类型
转换的一般形式: (
类型
说明符 *)
指针
表达式 其作用是把“
指针
表达式”的值的
类型
转换成“
类型
说明符”指定的
指针
类型
。例如: int * px, x = 10; float * pf; px = &x; pf = (float *)px; //把px保存的int
类型
地址转换为float
类型
地址 以下是我的疑惑之处,问了大佬解惑。 1.变量x依然是int...
C++
指针
类型
与
强制转换
C++
指针
类型
指针
,用来描述内存地址,并通过提供
指针
操作来实现与内存相关的程序功能。
指针
是一个特殊数据
类型
,也可以理解为混合数据
类型
。
指针
具有数据
类型
信息及数据在内存空间的地址。 C++
指针
的
类型
转换 问题的由来:当我们想打印
指针
地址时,或是某些需求想得到地址值时,我们必须转化为字符
类型
给显示组件。比如label等等。。。 问题分析:C++
指针
虽然像int
类型
或是long i...
C语言
70,023
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章