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就溢出了。 ..........因为LONG的字长只有16位(其中还有一位是正负号位)。。。。
AVR是8位机。
15位二进制到了11111111111111(BIN)就是最大值转换出来十进制就是32767
参见C语言语法 LONG是有符号整形
取值区间应该是 -32767 到 +32767之间
貌似arduino没有无符号整形。
C++有
还有就是字长是8位的机器 和现在的X64机器的字长是不一样的 本帖最后由 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出的问题,
怎么才能把数值变成字符串呢? 是不是要写成 sprintf(st,"%ld",c); 楼上正解问题出在%d 得用ld 本帖最后由 shihaipeng04 于 2014-3-11 21:45 编辑
转角 发表于 2014-3-11 16:32 static/image/common/back.gif
楼上正解问题出在%d 得用ld
噢耶噢耶。刚才弄错程序了, 现在一切正常啦。哈哈~~~ 可以跑到 21亿了,没问题的说。 sprintf是个很高科技的东西。哈哈 shihaipeng04 发表于 2014-3-11 11:05 static/image/common/back.gif
不是吧。 int才是-32768~32767,long是4位的 是-21亿。。后面忘了。 不管有没有符号完全不影响32768的溢 ...
受教了~~~~~~~~ shihaipeng04 发表于 2014-3-11 21:27 static/image/common/back.gif
噢耶噢耶。刚才弄错程序了, 现在一切正常啦。哈哈~~~ 可以跑到 21亿了,没问题的说。 sprintf是个很高 ...
把哪里搞错了
页:
[1]