搜索
bottom↓
回复: 20

为什么keil用%d打印整型数值是不准确的?

[复制链接]

出0入0汤圆

发表于 2014-9-30 15:02:28 | 显示全部楼层 |阅读模式
不知道是不是我弄错了,这个现象很奇怪。

源码如下:
  1. /*------------------------------------------------------------------------------
  2. HELLO.C

  3. Copyright 1995-1999 Keil Software, Inc.
  4. ------------------------------------------------------------------------------*/

  5. #include <REG52.H>                /* special function register declarations   */
  6.                                   /* for the intended 8051 derivative         */

  7. #include <stdio.h>                /* prototype declarations for I/O functions */


  8. #ifdef MONITOR51                         /* Debugging with Monitor-51 needs   */
  9. char code reserve [3] _at_ 0x23;         /* space for serial interrupt if     */
  10. #endif                                   /* Stop Exection with Serial Intr.   */
  11.                                          /* is enabled                        */


  12. /*------------------------------------------------
  13. The main C function.  Program execution starts
  14. here after stack initialization.
  15. ------------------------------------------------*/
  16. void main (void) {
  17.         char k=35;
  18. /*------------------------------------------------
  19. Setup the serial port for 1200 baud at 16MHz.
  20. ------------------------------------------------*/
  21. #ifndef MONITOR51
  22.     SCON  = 0x50;                        /* SCON: mode 1, 8-bit UART, enable rcvr      */
  23.     TMOD |= 0x20;               /* TMOD: timer 1, mode 2, 8-bit reload        */
  24.     TH1   = 221;                /* TH1:  reload value for 1200 baud @ 16MHz   */
  25.     TR1   = 1;                  /* TR1:  timer 1 run                          */
  26.     TI    = 1;                  /* TI:   set TI to send first char of UART    */
  27. #endif
  28.        
  29. /*------------------------------------------------
  30. Note that an embedded program never exits (because
  31. there is no operating system to return to).  It
  32. must loop and execute forever.
  33. ------------------------------------------------*/
  34.   while (1) {
  35.     P1 ^= 0x01;                         /* Toggle P1.0 each time we print */
  36.     printf ("Hello World,k=%d\n",k);   /* Print "Hello World" */
  37.   }
  38. }

复制代码


工程是keil安装后的C:\Keil\C51\EXAMPLES\HELLO 中的工程,拿来直接编译的,通过simulator模拟,从串口看时如下的结果:

明明k初始化为k=35,但是为什么打印的时候是8960呢,我计算了一下,8960为35的256倍,当初始化k=1时,打印的printf出来的k=256。
谁知道这是为什么吗?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入93汤圆

发表于 2014-9-30 15:05:36 | 显示全部楼层
改成printf ("Hello World,k=%d\n",(int)k);试试

出0入0汤圆

 楼主| 发表于 2014-9-30 15:08:29 | 显示全部楼层
自己回一下:
重新测试了一下,看来强制类型转换出了问题。
需要变量类型与printf中的转义类型统一才行。
即: int k=1;时,printf("k=%d\n",k); 输出的值才是正确的k=1,而不是256。

大家用的时候都是这样吗?

出0入25汤圆

发表于 2014-9-30 15:10:36 | 显示全部楼层
char是8位的,要用%bd,不能用%d

C51这点和标准C不一样。。

出0入0汤圆

发表于 2014-9-30 15:15:55 | 显示全部楼层
刚刚试了一下,在MDK5.0里,不会出现LZ的问题。
估计是C51的定义不同吧。

出0入0汤圆

 楼主| 发表于 2014-9-30 15:20:08 | 显示全部楼层
takashiki 发表于 2014-9-30 15:05
改成printf ("Hello World,k=%d\n",(int)k);试试

这招是可以的。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2014-9-30 15:21:32 | 显示全部楼层
XIVN1987 发表于 2014-9-30 15:10
char是8位的,要用%bd,不能用%d

C51这点和标准C不一样。。

想当然的以为一样了。
谢谢兄弟提醒。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-30 15:22:10 | 显示全部楼层
应该是与编译环境有关

出0入0汤圆

 楼主| 发表于 2014-9-30 15:23:18 | 显示全部楼层
ahong2hao 发表于 2014-9-30 15:15
刚刚试了一下,在MDK5.0里,不会出现LZ的问题。
估计是C51的定义不同吧。

多谢帮忙测试。
估计是我使用的keil版本太老了,新的版本已经修改了bug。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-9-30 15:28:37 | 显示全部楼层
d int Signed decimal number.
The optional characters b or B may immediately precede the type character to respectively specify char types for d, i, u, o, x, and X.

出0入25汤圆

发表于 2014-9-30 15:34:40 | 显示全部楼层
winterw 发表于 2014-9-30 15:23
多谢帮忙测试。
估计是我使用的keil版本太老了,新的版本已经修改了bug。
...


不是这样的,这个是C51自己的规定,新版C51也是这样的

MDK是ARM的开发工具,跟51单片机的C51没有关系

出0入0汤圆

 楼主| 发表于 2014-9-30 15:41:18 | 显示全部楼层
cpwander 发表于 2014-9-30 15:28
d int Signed decimal number.
The optional characters b or B may immediately precede the type charac ...

Yep,you're right.I should be serious. no zuo no die.

出0入0汤圆

 楼主| 发表于 2014-9-30 15:43:32 | 显示全部楼层
XIVN1987 发表于 2014-9-30 15:34
不是这样的,这个是C51自己的规定,新版C51也是这样的

MDK是ARM的开发工具,跟51单片机的C51没有关系 ...

你又帮我纠正了一个keil for arm 和keil for 51的概念。
再次表示感谢。

出0入0汤圆

 楼主| 发表于 2014-9-30 15:48:05 | 显示全部楼层
XIVN1987 发表于 2014-9-30 15:34
不是这样的,这个是C51自己的规定,新版C51也是这样的

MDK是ARM的开发工具,跟51单片机的C51没有关系 ...

看了这张图终于明白了keil的众多版本是做什么用的了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2014-10-1 21:13:43 | 显示全部楼层
我想问一下LZ,你是在开发单片机的时候使用的printf吗?

那如果使用的话,要另外加什么重映射的函数呢?还是有什么设置呢?

LZ可以告诉我一下吗?我只在STM32中使用printf函数,在51中还没有使用过printf函数。

出0入0汤圆

发表于 2014-10-1 22:01:45 | 显示全部楼层
两个嘴巴笑110 发表于 2014-10-1 21:13
我想问一下LZ,你是在开发单片机的时候使用的printf吗?

那如果使用的话,要另外加什么重映射的函数呢?还 ...

补充映射,怎么到串口上。

出0入0汤圆

发表于 2014-10-1 22:02:45 | 显示全部楼层
到底是编译器还是c51的问题,我用IAR一直这么用的,没有问题。

出0入0汤圆

发表于 2014-10-1 22:03:00 | 显示全部楼层
gujiamao_love 发表于 2014-10-1 22:01
补充映射,怎么到串口上。

就是和STM32一样,要加入printf的重映射函数吧?

出0入0汤圆

发表于 2014-10-1 22:09:03 | 显示全部楼层
两个嘴巴笑110 发表于 2014-10-1 22:03
就是和STM32一样,要加入printf的重映射函数吧?

是的,但是51还是不要用printf吧,占用的资源较多。

出0入0汤圆

发表于 2014-10-2 00:12:27 来自手机 | 显示全部楼层
Keil C少用吧。SDCC就没这么纠结了

出0入0汤圆

 楼主| 发表于 2014-10-2 18:15:45 | 显示全部楼层
两个嘴巴笑110 发表于 2014-10-1 21:13
我想问一下LZ,你是在开发单片机的时候使用的printf吗?

那如果使用的话,要另外加什么重映射的函数呢?还 ...
  1. void Uprintf(char *str,...)
  2. {
  3.         char xdata buf[128];
  4.         unsigned char xdata i = 0;
  5.         xdata va_list ptr;
  6.         va_start(ptr,str);
  7.         memset(buf,0,sizeof(buf));
  8.         vsprintf(buf,str,ptr);

  9.         while(buf[i])
  10.         {
  11.                 Serial_SendChar(buf[i]);
  12.                 i++;
  13.         }
  14. }
复制代码

我重新实现了一下printf函数。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-26 00:49

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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