runball 发表于 2019-8-20 11:57:26

单片机位判断,与预期想去甚远,分析不出来

只是简单判断寄存器的每个bit的值,输出高低电平。本来0xFF判断后应该输出8个“1”,结果烧录出来后用示波器测试是“1100 0000”。程序拷出来用VS2019单步执行,还是一样的结果,百思不得其解,望坛友解惑,以下是程序代码:

runball 发表于 2019-8-20 11:58:04

#include <iostream>int main() {         unsigned char n = 0;         unsigned char Data = 0xff;         unsigned char temp = 0;         temp = Data;         for (n = 0; n < 8; n++)         {                 if (temp & 0x80 == 0x80)                 {                         std::cout << "1\n";                 }                 else                 {                         std::cout << "0\n";                 }                 temp = Data << n;         } }

runball 发表于 2019-8-20 11:58:33

不会编辑格式,看起来好乱,望见谅

runball 发表于 2019-8-20 12:01:28

截图在此

javenreal 发表于 2019-8-20 12:03:16

代码改成这样试试:

         for (n = 0; n < 8; n++)
         {
                if ((temp & 0x80) == 0x80)
               {
                         std::cout << "1\n";
               }
               else
               {
                         std::cout << "0\n";
               }
               temp <<= 1;
         }

lcw_swust 发表于 2019-8-20 12:03:32

注意优先级
if (temp & 0x80 == 0x80)
改为
if ((temp & 0x80) == 0x80)

if (temp & 0x80)

wudicgi 发表于 2019-8-20 12:03:34

运算符优先级问题,VS 都给你标出来了,== 比 & 的优先级高
另外只判断最高位的话写 (temp & 0x80) != 0 好一些

runball 发表于 2019-8-20 12:08:09

药到病除,多谢坛友出手相助

mcu5i51 发表于 2019-8-20 17:54:29

怎么不用 if ((temp & 0x80) )

HalenYU 发表于 2019-8-20 18:13:34

百思不得其解时,可以加加括号,或者把运算代码一步步拆开运算调试

huangqi412 发表于 2019-8-20 19:40:54

不用括号不拆开分步执行的后果

gaolf_2012 发表于 2019-8-20 19:56:56

temp = Data << n; n应该改成1

dreampet 发表于 2019-8-20 20:25:20

编译器都给你标出警告了

mfketggo111 发表于 2019-8-20 20:37:47

大VS都给你波浪线了,问题很明显的
页: [1]
查看完整版本: 单片机位判断,与预期想去甚远,分析不出来