shihaipeng04 发表于 2014-3-11 02:41:47

sprintf的转换会溢出

本帖最后由 shihaipeng04 于 2014-3-12 15:43 编辑


void setup()
{
Serial.begin(9600);
}

void loop()
{
long c;
char st;
for (c=100;c<1000000;c+=373)
{
    sprintf(st,"%d",c);
    Serial.println(st);
}
}



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

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

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

darkorigin 发表于 2014-3-11 08:37:43

..........因为LONG的字长只有16位(其中还有一位是正负号位)。。。。
AVR是8位机。
15位二进制到了11111111111111(BIN)就是最大值转换出来十进制就是32767
参见C语言语法

darkorigin 发表于 2014-3-11 08:43:28

LONG是有符号整形
取值区间应该是 -32767   到   +32767之间
貌似arduino没有无符号整形。
C++有

还有就是字长是8位的机器 和现在的X64机器的字长是不一样的

shihaipeng04 发表于 2014-3-11 11:05:28

本帖最后由 shihaipeng04 于 2014-3-11 11:09 编辑

darkorigin 发表于 2014-3-11 08:43 static/image/common/back.gif
LONG是有符号整形
取值区间应该是 -32767   到   +32767之间
貌似arduino没有无符号整形。


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

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


怎么才能把数值变成字符串呢?

zoologist 发表于 2014-3-11 13:44:13

是不是要写成 sprintf(st,"%ld",c);

转角 发表于 2014-3-11 16:32:06

楼上正解问题出在%d 得用ld

shihaipeng04 发表于 2014-3-11 21:27:51

本帖最后由 shihaipeng04 于 2014-3-11 21:45 编辑

转角 发表于 2014-3-11 16:32 static/image/common/back.gif
楼上正解问题出在%d 得用ld

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

darkorigin 发表于 2014-3-12 08:42:39

shihaipeng04 发表于 2014-3-11 11:05 static/image/common/back.gif
不是吧。 int才是-32768~32767,long是4位的 是-21亿。。后面忘了。 不管有没有符号完全不影响32768的溢 ...

受教了~~~~~~~~

转角 发表于 2014-3-12 10:18:41

shihaipeng04 发表于 2014-3-11 21:27 static/image/common/back.gif
噢耶噢耶。刚才弄错程序了, 现在一切正常啦。哈哈~~~ 可以跑到 21亿了,没问题的说。 sprintf是个很高 ...

把哪里搞错了
页: [1]
查看完整版本: sprintf的转换会溢出