编译器编译16bit单片机程序对数组data[0]=0x12,data[1]=0xBD,data[2]=0x00,data[3]=0x45转换成16进制整数12BD0045的报警
16bit单片机程序:
定义32bit一个变量,uint32_t decData = 0;
刚开始时在16bit和32bit单片机中都这样写:
decData = ( data[0] << 24) | (data[1] << 16) | (data[2] << 8 ) | data[3];
问题发现:
编译16bit单片机程序时,编译器一直报警,提示数据太大溢出;
编译32bit单片机程序时,编译器不报警。
疑问猜测:
16bit单片机不支持这样的写法?
查看芯片技术手册,发现芯片内部有32bit硬件乘法器,
程序改良:
decData = ( data[0] *2^24) | (data[1] *2^16) | (data[2]*2^8) | data[3];
不过这样写还得实现一个类似pow功能函数或者直接调用C语言库函数pow,C语言库函数的pow都是double参数和字节实现返回值,用着不习惯,自己实现一个pow功能函数,
uint32_t powFunc(uint8_t x,uint8_t power)//n的几次方
{
if(power == 0)
{
return 1;
}
if(power == 1)
{
return x;
}
return x*powFunc(x,power-1);
}
decData = (data[0]*powFunc(2,24)) | (data[1]*powFunc(2,16)) | (data[2]*powFunc(2,8)) | data[3] ;
后来想了想,这样写一个函数占内存空间,把上面的代码再改良,如下:
decData = ( data[0] *0x1000000UL) | (data[1]*0x10000UL) | (data[2] *0x100UL) | data[3];
或者宏定义:
#define SHIFT_LEFT_24BIT 0x1000000UL
#define SHIFT_LEFT_16BIT 0x10000UL
#define SHIFT_LEFT_8BIT 0x100UL
decData = ( data[0] * SHIFT_LEFT_24BIT) | (data[1]*SHIFT_LEFT_16BIT) | (data[2] *SHIFT_LEFT_8BITL) | data[3];
发现这样也占内存,不过看着能理解其中的意思,但是考虑到芯片内存比较小,最后退回上一个写法:
decData = ( data[0] * 0x1000000UL) | (data[1] * 0x10000UL) | (data[2] * 0x100UL) | data[3];
这样顺利解决了编译器报警溢出问题,换算出来的数据正常没有问题。
在32bit单片机程序中,用上面三种方式得到的结果都是一样的,如下图所示:
编译器编译16bit单片机程序对数组data[0]=0x12,data[1]=0xBD,data[2]=0x00,data[3]=0x45转换成16进制整数12BD0045的报警相关推荐
- java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法
byte数组转换成16进制字符串String: public class CommonUtil { /** * byte数组转换成16进制字符串 * @param src * @return */ p ...
- java字节数组转换成16进制_Java 将字节数组转化为16进制的多种方案
很多时候我们需要将字节数组转化为16进制字符串来保存,尤其在很多加密的场景中,例如保存密钥等.因为字节数组,除了写入文件或者以二进制的形式写入数据库以外,无法直接转为为字符串,因为字符串结尾有\0,当 ...
- 将一个BYTE数组转换成16进制字符串和10进制字符串格式
背景: unsigned char port[5]; 以02x的格式打印出来是 00 00 02 00 00 1.如何转成16进制形式的字符串,使得char *strport16 = "00 ...
- python定义16进制数组_python 文件转成16进制数组的实例
如下所示: #! /usr/bin/python2 # coding=utf-8 import numpy import binascii if __name__=='__main__': #my_m ...
- C# 中字符串string和字节数组byte[]的转换,16 进制字符串转 int的方法
string和byte[]互转 string转byte[] byte[] byteArray = System.Text.Encoding.Default.GetBytes(str); byte[] ...
- 请教关于 license.licx 不能转换成2进制文件!(c# 开发web应用程序)
我是一名软件学院的学生,前几天在我们工程实习的项目中遇到这个问题,老师说在项目中删掉这个文件就可以成功运行了(确实也可以了),但我未知缘由!我想或许还有不删除的解决方法,故请教各位前辈,我感激之至! ...
- 加密解密基础问题:字节数组和(16进制)字符串的相互转换
在加密时,一般加密算法和hash算法,它们操作的都是字节数组,对字节数组按照加密算法进行各种变换,运算,得到的结果也是字节数组.而我们一般是要求对字符串进行加密,所以就涉及到字符串String到 by ...
- java php des加密 byte数组16进制 DESTools
大家好,我是烤鸭: 今天分享的是java 和 php des 加密. 因为接口对接,难免不同语言,加密又是必不可少的. 作为接口的提供方,必须把加密规则写好,最好有不同语言的加密demo. 1. ...
- openssl库编译-及16进制的key转Rsa数据结构
1. linux 下编译 源码地址为:https://www.openssl.org/source/old/:当前最新版本为 1.1.0f,https://www.openssl.org/source ...
最新文章
- 回文数:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
- Your First Concordion.Net Project (Part 5)-Running Specs with Gallio
- python中局部变量和全局变量
- 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
- android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...
- .NET 反编译调试神器:dnSpy了解一下
- java开发工作经历_开发人员在寻找第二份工作时会经历什么
- 《htmlxhtml权威指南》部分标签语义学习
- Windows Server 2016-DHCP服务器审核日志大小调整
- 免费的文本分析 文本挖掘软件工具(第一部分)
- DB2 SQLCODE常见错误代码
- 爆料!爆料!亚马逊跨境电商店铺骗局被骗真相曝光!不要在上当了!
- connect: cannot assign requested address
- 中央电大 c语言程序设计a 试题,最新-中央电大2008年秋C语言程序设计A试题1.doc...
- mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
- PRACH, preamble, RO 的关系与区别
- 如何centos7中查看IP地址
- 如何从Spark官网下载开发版本
- 个人桌面版linux,Linux 个人桌面版压根普及不了,就目前的情况来看……
- 新手福音,史上最详细的ALLEGRO导出GERBER教程!