野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 16810|回复: 0

【每日一问】C语言数据类型强制转换顺序的思考?

[复制链接]
发表于 2020-3-31 18:43:48 | 显示全部楼层 |阅读模式
本帖最后由 liuliangdt 于 2020-3-31 18:50 编辑

我的上一个帖子:FreeRTOS移植警告 Warning : #223-D, 创建任务失败求助 ,刚开始在FreeRTOS中创建 <MAX6675_Task> 任务失败。找到原因后就可以正常的在FreeRTOS创建 <MAX6675_Task> 任务了,并且也能在串口助手里正确打印MAX6675读取到K型热电偶的温度。后来在查看 <MAX6675_Task> 任务的代码时无意中发现了个问题。就是关于C语言数据类型强制转换的问题。代码如下:
[mw_shl_code=c,true]static void MAX6675_Task (void *parameter)
{
  unsigned char flag;
  unsigned int resulte;
  float temprature;
  while (1)
  {
    printf ("当前正在运行MAX6675_Task任务\r\n");
    MAX6675_CSL();
    flag = MAX6675_ReadByte ();
    /*这是没发现问题之前使用的语句*/
//  resulte = (unsigned int)(flag << 8);
    /*这是感觉奇怪之后改为使用的语句*/
    resulte = (unsigned int)flag << 8;
    flag = MAX6675_ReadByte ();
    MAX6675_CSH();
    resulte |= (unsigned int)flag;
    flag = (unsigned char)((resulte & 0x0004) >> 2);
    if (flag)
    {
      printf ("检测到MAX6675温度探头断线。\r\n");
      goto lable;
    }
    resulte = (resulte & 0x00007ff8) >> 3;
    temprature = (float) (1023.75 * resulte / 4095);
    printf ("当前温度:%.2f\r\n",temprature);
    lable :
    vTaskDelay (5000);
  }
}[/mw_shl_code]
上面代码中:/*这是没发现问题之前使用的语句*/  resulte = (unsigned int)(flag << 8);  与:/*这是感觉奇怪之后改为使用的语句*/  resulte = (unsigned int)flag << 8; 在串口助手里打印出的温度值都值正常的,我不知道这是编译器优化了,还是C语言可以?结果如图:

/*这是没发现问题之前使用的语句*/  resulte = (unsigned int)(flag << 8);
截图-1.jpg 截图-2.jpg

/*这是感觉奇怪之后改为使用的语句*/  resulte = (unsigned int)flag << 8;
截图-3.jpg
截图-4.jpg

因为在我思维中,flag 是 unsigned char 型数据。要先将 flag 强制转为 unsigned int 型数据才能把 flag 中低8位数据往左移8位。而语句 resulte = (unsigned int)(flag << 8); 中我理解顺序先是 unsigned char flag 8位数据往左移8位,目前应该是 0x00 了,然后再强制转换为 unsigned int 类型数据,最终赋给 result 的值是  unsigned int 型的 0 。这样看来,MAX6675送给单片机的温度值就应该是错误的。刚算了一下就算没问题在串口助手里最大也只能打印出64出来。没有发现这问题之前我试过用打火机把K型热电偶探头加热到一百多度在串口助手里打印出来。

请教像上面代码实验中,强制数据类型转换的顺序过程是怎样的?


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-29 19:02 , Processed in 0.039342 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表