完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
电子发烧友论坛|
大家好,从一个新来的人到C(XC16)的问题,我需要把一个16位宽的字分成两个8位的字节。我找不到一个简单而优雅的方法来做这件事。我在我的Microchip课程中找到了一些东西:使用一个结构中的一个结构:联合{UtiN Word;Stutt{Unt8ByTe0:0:Unt8ByTE1;8;};} w;但是我不能想象在C中没有其他预定义的方法来做同样的事情!谢谢你的帮助。
|
|
相关推荐
19个回答
|
|
|
还有其他方法(比如掩饰和移动),但是联盟“技巧”是最优雅和高效的。
|
|
|
|
|
|
联合方法的唯一问题是它假定字节顺序。如果字节存储的字节数很少。(即LS字节跟随MS字节),然后在联合字节中是LS字节,字节1是MS字节。如果CPU使用大endian,那么它就不能工作。做这件事的通用方法是:你可以通过声明宏来使它变得漂亮。这是我的建议。它总是比W.BYTE0更有效,更具解释力。
|
|
|
|
|
|
是的,就像这里的HTTP//www. McCHIP.COM/FUMMS/M/TM.ASPX?M=531031
|
|
|
|
|
|
最好的办法是定义宏,比如注意x周围的括号。这样可以确保LOBYTE(a^b)之类的东西正常工作。另外,注意在HIBYTE(x)中应用的类型转换——一些C编译器可以以不同的方式右移带符号的数字。
|
|
|
|
|
|
Endian-ness是一个小问题:当可移植性是一个问题时,定义适当的联合并根据endian-ness激活正确的联合。移位通常包含一些“惩罚”,除非编译器“非常聪明”。
|
|
|
|
|
|
移位和面罩工作不受循环的影响。工会没有。
|
|
|
|
|
|
实际上,如果有条件编译,他们会这么做。
|
|
|
|
|
|
不是我的经验,每个人都知道如何移动8或16。
|
|
|
|
|
|
而且一个非常聪明的编译器可以通过直接访问所需的字节来避免移位。这将避免移位运行时和代码惩罚。这同样适用于掩蔽操作的优化。
|
|
|
|
|
|
为什么我要费心去编写和测试那些额外的代码,然后去弄清楚一个平台的附庸?然后必须重新审视每一个新平台的代码吗?有什么好处?性能?任何现代编译器都不太可能。为此目的使用工会是一种不寻常情况的最后手段。
|
|
|
|
|
|
使用联合概念的原因是性能、性能、性能。联合允许单个读取操作访问字节。屏蔽至少需要获取单词,最终获取掩码,并执行.。加上需要的转移。在以前的移位中,每比特移位一个时钟周期:‘GT;Gt;8’的8个周期。现代建筑实现桶移位器,在一个周期内进行移位。任何时候,你可能不会忘记额外的代码,代码获取等性能和“内存”无关紧要:随意转移。
|
|
|
|
|
|
我认为这不重要。逻辑移位产生0xAABB & gt;gt;8=0x00 AA,算术移位产生0xAABB & gt;8;这里我们只关注下位字节。关于端点,如果有一个标准,编译器/平台生成一个表示端点的符号,那就太好了。然后,该符号可用于条件编译。
|
|
|
|
|
|
你有记录。我这样做了好几年,这都是徒劳的:
|
|
|
|
|
|
没有转变!
|
|
|
|
|
|
这都假设编译器会进行转换。这个优化很老了,试试看,看看ASM。在PRO模式下,我假定最好,但不能肯定更低。
|
|
|
|
|
|
好的辩论一些有趣的解决方案。回到故事令人惊讶的开始看到,C是一种语言相当接近的硬件是没有原生的解决方案,但小于ASM。我来自picbasic亲氟。这个语言的解决方案是:x = W。byte0y = w.byte1everything已经完成了(但我同意,我不知道…)我已经花了几个小时在我的24f.mr绿色找到C等效:转移是一个有趣的解决方案但它是耗时的,这部分我的程序是非常time-critical.and的24f无桶式移位器。所以,我我会和工会呆在一起,如果需要的话,可能会搬到ASM。谢谢你的帮助。凯尔特
|
|
|
|
|
|
如果仔细阅读讨论,就会发现当前编译器在8位的倍数时没有实际使用移位指令。
|
|
|
|
|
|
…除了免费编译器。从XC16 V1.30免费模式:这里是宏和联合从同一编译器:PRO编译器应该做得更好。
|
|
|
|
|
|
HiAnyone在使用指针的刑罚理念和铸造。考虑一个固定地址的变量,编译器应计算地址和访问的高、低字节,直接在一个单一的指令。还是我错过了什么?我知道字节存储顺序也使用指针的问题,所以不会被整理出来,但可能会避免任何风险的最佳regardsjorge转移。
|
|
|
|
|
只有小组成员才能发言,加入小组>>
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473 浏览 0 评论
5793 浏览 9 评论
2334 浏览 8 评论
2224 浏览 10 评论
请问是否能把一个ADC值转换成两个字节用来设置PWM占空比?
3530 浏览 3 评论
1122浏览 1评论
有偿咨询,关于MPLAB X IPE烧录PIC32MX所遇到的问题
1095浏览 1评论
我是Microchip 的代理商,有PIC16F1829T-I/SS 技术问题可以咨询我,微信:A-chip-Ti
872浏览 1评论
MPLAB X IDE V6.25版本怎么对bootloader和应用程序进行烧录
473浏览 0评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 22:04 , Processed in 1.418111 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖
10137