C语言符号优先级——(“++”符号的的坑)
最近在做一个读EEPROM中的电压数据,并把数据通过CAN报文发送到上位机的功能。
由于EEPROM读出来的数据是一个字节大小的数据,长度是8位,而电压数据大小是12位,并且,读出来后要把数据再重新整理一下。 一串电池有12个电芯,我需要获得的电压值就是12个值,EEPROM中存储的数据就是12*12/8=18个字节。同时也知道,EEPROM中的数据是按顺序存储的。
在读到18个字节的数据后,于是小弟我就做了以下的操作:
/* 将18个字节的EEPROM数据,转换为12个字节的电压 */
for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);
}
else
{
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[++j];
j++;
}
}
获取到的电压值完全不是我想要的结果。。。。。。
为了弄清楚咋回事,我给eeprom数组都赋了值,重新输出结果:
/* eeprom数组赋值,voltage_value理论结果都为0xFBD */
for(i=0;i<6;i++)
{
eeprom[i*3]=0xFB;
eeprom[i*3+1]=0xDF;
eeprom[i*3+2]=0xBD;
}
/* 将18个字节的EEPROM数据,转换为12个字节的电压 */
for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);
}
else
{
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[++j];
j++;
}
}
/* 打印结果*/
for(i=0;i<12;i++)
{
printf("%x\t",voltage_value[i]);
}
仔细看打印结果,会发现第一个数据为0xdfd,就已经出了问题。
这一句 voltage_value[i]=(eeprom[j]<<4)+((eeprom[++j]&0xF0)>>4);
运算是先进行了“++j"的操作,因此得出来的结果是voltage_value[0]=(eeprom[1]<<4)+((eeprom[1]&0xF0)>>4);
而不是voltage_value[0]=(eeprom[0]<<4)+((eeprom[1]&0xF0)>>4);
========================华丽丽的分割线=====================================
代码改一下:
for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
voltage_value[i]=(eeprom[j]<<4)+((eeprom[1+j]&0xF0)>>4);
j++;
}
else
{
voltage_value[i]=((eeprom[j]&0x0F)<<8) + eeprom[1+j];
j +=2;
}
}
打印结果正常了
========================华丽丽的分割线=====================================
或者分开来写:
for(i=0,j=0;i<12;i++)
{
if((i%2)==0)
{
eeprom_value[i]=(eeprom[j]<<4);
eeprom_value[i] +=((eeprom[++j]&0xF0)>>4);
}
else
{
eeprom_value[i]=((eeprom[j]&0x0F)<<8);
eeprom_value[i] += eeprom[++j];
j++;
}
}
同样没有问题了:
·
C语言符号优先级——(“++”符号的的坑)相关推荐
- C语言运算符号优先级
1.符号概述 C语言基本上是所有语言里面运算符号最多的一种了.学习C语言不可避免要运用到运算符号.优先级和结合性是学习符号最重要的点. 2.优先级和结合性 基本优先级: 指针最优,单目运算优于双目运算 ...
- c语言中 ||优先级,C语言运算符号的优先级 A: B: C:|| D:|
我知道从高到低为:圆括号 单目运算符 算术运算符 关系运算符 逻辑运算C语言运算符优先级顺序如下所示: 自增运算符 ++ 和自减运算符 ,在作后缀运算符(如表达式 x++)时,较其用作前缀运算符(如表 ...
- C语言基础——连续大于连续小于的多种表示方式,及符号优先级
以 10<a<15为例 错误表示 int a = 20; printf("%b\n", 10<a<15); 输出结果为1,说明不可这样表示,但是并不报错:先 ...
- 编程优先级c语言,C语言中运算符号的优先级
C语言中运算符号的优先级 发布时间:2020-06-20 16:13:39 来源:亿速云 阅读:117 作者:Leah 这期内容当中小编将会给大家带来有关C语言中运算符号的优先级,以专业的角度为大家分 ...
- c语言常用符号优先级问题,【C语言】符号优先级
一. 问题的引出 今天看阿里的笔试题,看到一个非常有意思的题目,但是很容易出错. 题目:如下函数,在32bit系统foo(2^31-3)的值是: Int foo(int x) { return x&a ...
- Java语言中运算符号优先级
一.运算符号优先级 二.按功能区分运算符 算术运算符:+,-,*,/,%,++,-- 赋值运算符:= 扩展后的赋值运算符:+=,-=,*=,/=,%=,&=,|=,^=,<<=,& ...
- 【转】C语言中的符号优先级
转自: http://blog.csdn.net/huangblog/article/details/8271791 虽然在日常使用中,添加括号来明确规定运算符优先级是一种常识,但毕竟学校考试就喜欢考 ...
- c 语言运算符号大全,c语言关系运算符号有哪些?
c语言关系运算符号有".>=.==.!=".关系运算符都是双目运算符,其的作用是判明这两个表达式的大小关系:关系运算符的优先级低于算术运算符,高于赋值运算符:其运算结果只有0 ...
- c语言中格式符号错误,C语言中符号格式说明
scanf 语法: #include int scanf( const char *format, ... ); scanf()函数根据由format(格式)指定的格式从stdin(标准输入)读取,并 ...
- c语言中特殊符号意义,C语言特殊符号意义Word版
<C语言特殊符号意义Word版>由会员分享,可在线阅读,更多相关<C语言特殊符号意义Word版(18页珍藏版)>请在人人文库网上搜索. 1.传播优秀Word版文档 ,希望对您有 ...
最新文章
- java gif 帧_在Java中修复动画gif的帧速率
- mysql goto,如何在MySQL存储函数中使用goto标签
- 【Groovy】Groovy 脚本调用 ( Linux 中调用 Groovy 脚本 | Windows 中调用 Groovy 脚本 )
- oracle联合主键怎么找,Oracle数据库联合主键
- 机器学习和深度学习资料合集
- SQL - 插入数据
- android 打好的补丁位置,Android 6.0上打完第一个补丁后再打新补丁Crash
- 数据分析岗位需求分析
- 产品设计必读书籍推荐
- 计算机模拟技术在高分子领域的应用,模拟技术的原理、方法及在高分子材料研究中的应用...
- 重构实例-消息发送-原始代码及准备-1
- 二维码被扫实时返回方案
- linux arm xenomai,Wiki - Xenomai
- opencv matlab配置,MATLAB配置mexopencv
- R语言基于mediation包行中介效应分析(2)
- mysql数据库备份和恢复
- 合并多个工作簿为一个工作簿和拆分工作簿为多个工作簿
- android版netspot,WiFi概观360 Pro直装解锁专业版
- python开发实例-python开发案例
- 将Openwrt路由器配置为无线交换机,实现同网段无线中继功能
热门文章
- 逻辑回归算法原理及python实现
- Janusgraph索引
- php paypal网站对接,php 接入 paypal 支付
- C++泛型编程——迭代器
- JDK 内置的轻量级 HTTP 服务器 --- HttpServer
- android addr2line 用法,Android studio中NDK开发(四)——使用addr2line分析Crash日志
- 计算机专业有没有3D打印,3D打印技术属于哪个专业_招生问答
- Java proxy 代理
- ISO七层协议与功能
- 高斯列主元消去法matlab,高斯列主元消去法解线性方程组的实现