C Arduino乘法错误&x2B;ve*+;ve变成-ve
我正在用一个简单的脚本对不同的平台和语言进行基准测试,该脚本模拟了。在测试过程中,我发现我的arduino被种子447卡住了,在那里int 13121乘以三就得到了-26173 我最初的代码是`C Arduino乘法错误&x2B;ve*+;ve变成-ve,c,arduino,avr,C,Arduino,Avr,我正在用一个简单的脚本对不同的平台和语言进行基准测试,该脚本模拟了。在测试过程中,我发现我的arduino被种子447卡住了,在那里int 13121乘以三就得到了-26173 我最初的代码是` //made by Hugo K //jun 13 2014 void setup() { Serial.begin(9600); while (!Serial) { ;//wait for serial to connect } } void loop() {
//made by Hugo K
//jun 13 2014
void setup()
{
Serial.begin(9600);
while (!Serial)
{
;//wait for serial to connect
}
}
void loop()
{
unsigned long starttime;
starttime = millis();
for (int i = 1; i <= 500; i++)
{
int a = i;
while (a != 1)
{
if (a%2 == 0)
{
a = a/2;
}
else
{
a = (a*3) + 1;
}
//Serial.println(a);
}
}
Serial.println(millis() - starttime);
}`
里面的atmega微控制器有什么问题吗?或者int 13121有什么问题,会打乱传统的乘法吗?您对int为32位的期望有点错误。用AVR;如果需要32位,请使用
long
。因为在这种体系结构中,sizeof(int)==2,所以最大正整数是0x7FFF(32767),而在您的情况下是39363
使用unsigned int将最大值增加到0xFFFF
使用unsigned long-to 0xFFFFFFFF他需要unsigned long来获得32位,“long”将为他提供31@OlegGryb
long
是32位。。。1个符号位和31个精度位自从他处理正数时,他能得到的“long”的最大值是0x7FFFFFFF,即31位,而在无符号long的情况下,最大值是0xFFFFFFFF(32位)。如果不使用无符号类型,他将丢失一位。如果需要32位,请不要使用long
。每当您对数据类型有具体要求时,请在声明中明确说明。在这种情况下,请使用uint32\u t
或int32\u t
。
void setup()
{
Serial.begin(9600);
while(!Serial)
{
}
}
void loop()
{
int i = 13121;
Serial.println(i *3);
}`