我正在Arduino做一个基本操作,由于某种原因(这就是我需要你的原因)它给了我一个完全不合适的结果 . 以下是代码:
long init_H_top; //I am declaring it a long to make sure I got enough bytes init_H_top=251*255/360; //gives me -4 and it should be 178
知道为什么会这样吗?我很困惑......谢谢!
您的变量可能是 long 但是您的常量( 251 , 255 和 360 )不是 .
long
251
255
360
它们是 int 类型,因此将计算给出 int 结果,然后在任何溢出已经完成损坏后将其放入 long 变量 .
int
由于Arduino具有16位 int 类型, 251 * 255 ( 64005 )将超过 32767 的最大整数,并导致您看到的行为 . 值 64005 在16位二进制补码中为 -1531 ,当你将其除以 360 时,得到的 -4.25 截断为 -4 .
251 * 255
64005
32767
-1531
-4.25
-4
您应该使用 long 常量来避免这种情况:
init_H_top = 251L * 255L / 360L;
1 回答
您的变量可能是
long
但是您的常量(251
,255
和360
)不是 .它们是
int
类型,因此将计算给出int
结果,然后在任何溢出已经完成损坏后将其放入long
变量 .由于Arduino具有16位
int
类型,251 * 255
(64005
)将超过32767
的最大整数,并导致您看到的行为 . 值64005
在16位二进制补码中为-1531
,当你将其除以360
时,得到的-4.25
截断为-4
.您应该使用
long
常量来避免这种情况: