极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 13536|回复: 8

sprintf的转换会溢出

[复制链接]
发表于 2014-3-11 02:41:47 | 显示全部楼层 |阅读模式
本帖最后由 shihaipeng04 于 2014-3-12 15:43 编辑

  1. void setup()
  2. {
  3.   Serial.begin(9600);
  4. }

  5. void loop()
  6. {
  7.   long c;
  8.   char st[20];
  9.   for (c=100;c<1000000;c+=373)
  10.   {
  11.     sprintf(st,"%d",c);
  12.     Serial.println(st);
  13.   }
  14. }

复制代码


程序很简单,一个long的变量循环增大。为什么到32768就溢出了?

经过试验发现 println(c)就不会溢出了。 是 sprintf在作祟。

还有啥办法是把比较大的数变成字符串的函数么?试了好几个办法了,都是32768就溢出了。
回复

使用道具 举报

发表于 2014-3-11 08:37:43 | 显示全部楼层
..........因为LONG的字长只有16位(其中还有一位是正负号位)。。。。
AVR是8位机。
15位二进制到了11111111111111(BIN)就是最大值转换出来十进制就是32767
参见C语言语法
回复 支持 反对

使用道具 举报

发表于 2014-3-11 08:43:28 | 显示全部楼层
LONG是有符号整形
取值区间应该是 -32767   到   +32767之间
貌似arduino没有无符号整形。
C++有

还有就是字长是8位的机器 和现在的X64机器的字长是不一样的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 11:05:28 | 显示全部楼层
本帖最后由 shihaipeng04 于 2014-3-11 11:09 编辑
darkorigin 发表于 2014-3-11 08:43
LONG是有符号整形
取值区间应该是 -32767   到   +32767之间
貌似arduino没有无符号整形。


不是吧。 int才是-32768~32767,long是4位的 是-21亿。。后面忘了。 不管有没有符号完全不影响32768的溢出啊?

刚才又试了一下直接输出就没事了,看来还是 printf出的问题,


怎么才能把数值变成字符串呢?
回复 支持 反对

使用道具 举报

发表于 2014-3-11 13:44:13 | 显示全部楼层
是不是要写成 sprintf(st,"%ld",c);
回复 支持 反对

使用道具 举报

发表于 2014-3-11 16:32:06 | 显示全部楼层
楼上正解  问题出在%d 得用ld
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-3-11 21:27:51 | 显示全部楼层
本帖最后由 shihaipeng04 于 2014-3-11 21:45 编辑
转角 发表于 2014-3-11 16:32
楼上正解  问题出在%d 得用ld


噢耶噢耶。刚才弄错程序了, 现在一切正常啦。哈哈~~~ 可以跑到 21亿了,没问题的说。 sprintf是个很高科技的东西。哈哈
回复 支持 反对

使用道具 举报

发表于 2014-3-12 08:42:39 | 显示全部楼层
shihaipeng04 发表于 2014-3-11 11:05
不是吧。 int才是-32768~32767,long是4位的 是-21亿。。后面忘了。 不管有没有符号完全不影响32768的溢 ...

受教了~~~~~~~~
回复 支持 反对

使用道具 举报

发表于 2014-3-12 10:18:41 | 显示全部楼层
shihaipeng04 发表于 2014-3-11 21:27
噢耶噢耶。刚才弄错程序了, 现在一切正常啦。哈哈~~~ 可以跑到 21亿了,没问题的说。 sprintf是个很高 ...

把哪里搞错了
回复 支持 反对

使用道具 举报

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

本版积分规则

Archiver|联系我们|极客工坊

GMT+8, 2026-6-6 01:18 , Processed in 0.035190 second(s), 20 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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