搜索
bottom↓
回复: 14

指针指向的变量,右移一位高位不补"0",这是什么原因?

[复制链接]

出0入27汤圆

发表于 2019-4-2 11:56:43 | 显示全部楼层 |阅读模式
本帖最后由 neutronlmk 于 2019-4-2 12:46 编辑

如下代码:
//指针
uint8_t test_tab[4];
uint8_t test_var;
uint8_t *p;
p = &test_tab[0];
*p = 0xFF;
(*p) >>= 1;//执行该条指令之后,test_tab[0]仍是0xFF。
//直接操作
test_var = 0xFF;
test_var >>= 1;//执行该条指令之后,test_var是0x7F,高位补"0"。
在多字节移位的情况下,移位之后高位不自动补“0”,需要多加好多代码来处理,低端的芯片空间不够扛不住。

我再编辑下,这个是匆忙精简出来的,指针赋值也错了。
另我看了汇编,使用指针移位汇编是按带进位的方式来移的。看来没法取巧利用移位补零的特性。
及——函数使用指针做参数,利用指针指向的变量输出结果,代码比直接使用全局变量大好多啊,足200字节。
芯片才1K~2K,不敢用。


出0入0汤圆

发表于 2019-4-2 12:00:56 | 显示全部楼层
>和>>不一样

出0入27汤圆

 楼主| 发表于 2019-4-2 12:02:19 | 显示全部楼层
不好意思,心急。
是》=

出0入0汤圆

发表于 2019-4-2 12:22:54 来自手机 | 显示全部楼层
看语法没毛病,看看编译后的汇编是啥!

出0入213汤圆

发表于 2019-4-2 12:33:05 来自手机 | 显示全部楼层
指针用错了吧!uint8_t *p; p = &test_tab[0];  *p = 0xFF;

出0入0汤圆

发表于 2019-4-2 12:38:55 | 显示全部楼层
可能是数据类型的问题,这样试试看:
(uint8_t)(*p) >> 1

出0入4汤圆

发表于 2019-4-2 12:56:22 | 显示全部楼层

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2019-4-2 13:35:51 | 显示全部楼层
没用到被优化了吧

出200入2554汤圆

发表于 2019-4-2 17:06:37 | 显示全部楼层
本帖最后由 t3486784401 于 2019-4-2 17:21 编辑

不知是什么编译器,我看是 51 分论坛的,就用 KEIL C51 v8.12 试了试,没发现 LZ 说的问题。



如图 (*p)>>=1 这一句被正确实现,使用 C?CLDPTR / C?CSTPTR 加载/存储指针内容,使用 RRC 实现无符号右移。
关于 RRC 指令的作用,下边截图说明。由于 C 已经被置零(C:0x003C行),因此是高位补零的操作。



不过 KEIL 优化很厉害的,如果程序最后一行是对某非 volatile 变量赋值,直接无视。

---------------------------------------------------------------------------------------------------------------------------------------

编辑原因:补充内容。

我又测试了 ICCAVR 编译器,一样没有出现 LZ 的问题,但是有一点需要注意:uint8_t 的定义不是标准 C。
所有测试都要加 typedef 这个定义(例如7楼)。但如果你定义错了,或者有疯狂的宏在作祟,就会有很作死的效果,例如:
typedef signed char uint8_t;

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入8汤圆

发表于 2019-4-2 17:14:41 | 显示全部楼层
估计就是6楼说得 数据类型得问题。

出0入27汤圆

 楼主| 发表于 2019-4-2 19:15:03 | 显示全部楼层
kebaojun305 发表于 2019-4-2 17:14
估计就是6楼说得 数据类型得问题。

我看了汇编,应该是我用的编译器的问题,是按带进位移位的方式去处理了。

出0入0汤圆

发表于 2019-4-3 08:30:58 | 显示全部楼层
小容量的51核MCU,还是少用指针,直接操作数组。简单方便。

出0入27汤圆

 楼主| 发表于 2019-4-3 22:49:15 来自手机 | 显示全部楼层
su33691 发表于 2019-4-3 08:30
小容量的51核MCU,还是少用指针,直接操作数组。简单方便。

确实,我已经放弃使用指针。用指针的档案存起来做资料了。

出0入0汤圆

发表于 2019-4-4 10:41:16 | 显示全部楼层
如果是KEIL的话,定义指针时一定要指明存储类型(即DATA、IDATA或XDATA),能提高效率减少代码很多

出0入27汤圆

 楼主| 发表于 2019-4-4 14:39:38 | 显示全部楼层
modbus 发表于 2019-4-4 10:41
如果是KEIL的话,定义指针时一定要指明存储类型(即DATA、IDATA或XDATA),能提高效率减少代码很多 ...

不是KEIL,单也能指定data空间,可惜指少了20字节左右。
放弃了指针,直接开放全局变量了。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 15:06

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表