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的报警相关推荐

  1. java 16进制数组 字符串_byte数组转换成16进制字符串和字符数组的方法

    byte数组转换成16进制字符串String: public class CommonUtil { /** * byte数组转换成16进制字符串 * @param src * @return */ p ...

  2. java字节数组转换成16进制_Java 将字节数组转化为16进制的多种方案

    很多时候我们需要将字节数组转化为16进制字符串来保存,尤其在很多加密的场景中,例如保存密钥等.因为字节数组,除了写入文件或者以二进制的形式写入数据库以外,无法直接转为为字符串,因为字符串结尾有\0,当 ...

  3. 将一个BYTE数组转换成16进制字符串和10进制字符串格式

    背景: unsigned char port[5]; 以02x的格式打印出来是 00 00 02 00 00 1.如何转成16进制形式的字符串,使得char *strport16 = "00 ...

  4. python定义16进制数组_python 文件转成16进制数组的实例

    如下所示: #! /usr/bin/python2 # coding=utf-8 import numpy import binascii if __name__=='__main__': #my_m ...

  5. C# 中字符串string和字节数组byte[]的转换,16 进制字符串转 int的方法

    string和byte[]互转 string转byte[] byte[] byteArray = System.Text.Encoding.Default.GetBytes(str); byte[] ...

  6. 请教关于 license.licx 不能转换成2进制文件!(c# 开发web应用程序)

    我是一名软件学院的学生,前几天在我们工程实习的项目中遇到这个问题,老师说在项目中删掉这个文件就可以成功运行了(确实也可以了),但我未知缘由!我想或许还有不删除的解决方法,故请教各位前辈,我感激之至! ...

  7. 加密解密基础问题:字节数组和(16进制)字符串的相互转换

    在加密时,一般加密算法和hash算法,它们操作的都是字节数组,对字节数组按照加密算法进行各种变换,运算,得到的结果也是字节数组.而我们一般是要求对字符串进行加密,所以就涉及到字符串String到 by ...

  8. java php des加密 byte数组16进制 DESTools

    大家好,我是烤鸭: 今天分享的是java 和 php des 加密. 因为接口对接,难免不同语言,加密又是必不可少的. 作为接口的提供方,必须把加密规则写好,最好有不同语言的加密demo. 1.    ...

  9. openssl库编译-及16进制的key转Rsa数据结构

    1. linux 下编译 源码地址为:https://www.openssl.org/source/old/:当前最新版本为 1.1.0f,https://www.openssl.org/source ...

最新文章

  1. 回文数:给你一个整数 x ,如果 x 是一个回文整数,返回 true ;否则,返回 false 。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。
  2. Your First Concordion.Net Project (Part 5)-Running Specs with Gallio
  3. python中局部变量和全局变量
  4. 遮挡摄像头 判断_长治一学校门口树枝遮挡信号灯,危险!
  5. android 内存播放视频播放器,视频流媒体播放器EasyPlayer-RTSP安卓版在RK3399上运行APP崩溃问题...
  6. .NET 反编译调试神器:dnSpy了解一下
  7. java开发工作经历_开发人员在寻找第二份工作时会经历什么
  8. 《htmlxhtml权威指南》部分标签语义学习
  9. Windows Server 2016-DHCP服务器审核日志大小调整
  10. 免费的文本分析 文本挖掘软件工具(第一部分)
  11. DB2 SQLCODE常见错误代码
  12. 爆料!爆料!亚马逊跨境电商店铺骗局被骗真相曝光!不要在上当了!
  13. connect: cannot assign requested address
  14. 中央电大 c语言程序设计a 试题,最新-中央电大2008年秋C语言程序设计A试题1.doc...
  15. mysql数据库如何添加外键约束_MySQL数据库之外键约束的简单理解
  16. PRACH, preamble, RO 的关系与区别
  17. 如何centos7中查看IP地址
  18. 如何从Spark官网下载开发版本
  19. 个人桌面版linux,Linux 个人桌面版压根普及不了,就目前的情况来看……
  20. 新手福音,史上最详细的ALLEGRO导出GERBER教程!

热门文章

  1. mysql --verbose --help
  2. 如何做好项目规划,完成一个保质保量的软件工程!
  3. 实例——在编程过程中进行单元测试
  4. Ubuntu18.04安装Multiwfn
  5. 情商(实践版本,丹尼尔.戈尔曼)---阅读记录
  6. Android BOOTCLASSPATH详解
  7. NK.bin和NK.nb0学习
  8. 02数据结构——算法概念
  9. Spring中日期格式转换
  10. C# WebApi+Task+WebSocket实战项目演练(四)