Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Types Arduino溢流_Types_Arduino_Overflow - Fatal编程技术网

Types Arduino溢流

Types Arduino溢流,types,arduino,overflow,Types,Arduino,Overflow,因此,我跟随来熟悉Arduino。在本课结束时,作者试图测试我对基本数学运算、位和字节概念的理解,以及如何使用适当类型的数据,方法是让我编写一个能够将任何给定GB转换为KB的程序。我认为这是一项容易的任务。但我想错了 这是我的原始代码: long drive_gb = 100; //given number long drive_kb; void setup() { Serial.begin(9600); Serial.print("Your HD is "); Serial

因此,我跟随来熟悉Arduino。在本课结束时,作者试图测试我对基本数学运算、位和字节概念的理解,以及如何使用适当类型的数据,方法是让我编写一个能够将任何给定GB转换为KB的程序。我认为这是一项容易的任务。但我想错了

这是我的原始代码:

long drive_gb = 100; //given number
long drive_kb;
void setup()
{
   Serial.begin(9600);

   Serial.print("Your HD is ");
   Serial.print(drive_gb);
   Serial.println(" GB large.");


   drive_kb = 1024*1024*drive_gb;

   Serial.print("It can store ");
   Serial.print(drive_kb);
   Serial.println(" Kilobytes!");

 }

 void loop()
 {
 }
但当我检查串行监视器时,我得到以下输出:

“您的硬盘容量为100 GB。 它可以存储0千字节!”

然后,我将代码修改为:

long drive_gb = 100;
 long drive_kb;
 long drive_mb;
 void setup()

 {
   Serial.begin(9600);

   Serial.print("Your HD is ");
   Serial.print(drive_gb);
   Serial.println(" GB large.");

   drive_mb = 1024*drive_gb;
   drive_kb = 1024*drive_mb;

   Serial.print("It can store ");
   Serial.print(drive_kb);
   Serial.println(" Kilobytes!");

 }

 void loop()
 {
 }
现在我得到了正确的输出

“您的硬盘容量为100 GB。 它可以存储104857600千字节! "

因此,我的问题是:

  • 第一个代码是否导致溢出情况?怎么做
  • 第一个代码与第二个代码在数学上有何不同

  • 谢谢

    要得到明确的答案,您需要列出编译器在第一个示例中生成的汇编代码

    我的猜测是
    X=1024*1024*Y
    没有考虑到存储结果需要使用long,而生成的代码使用ints


    Try:
    X=1024L*1024L*Y并查看是否得到正确答案。

    要得到明确答案,您需要列出编译器在第一个示例中生成的汇编代码

    我的猜测是
    X=1024*1024*Y
    没有考虑到存储结果需要使用long,而生成的代码使用ints


    Try:
    X=1024L*1024L*Y并查看是否得到正确答案。

    要得到明确答案,您需要列出编译器在第一个示例中生成的汇编代码

    我的猜测是
    X=1024*1024*Y
    没有考虑到存储结果需要使用long,而生成的代码使用ints


    Try:
    X=1024L*1024L*Y并查看是否得到正确答案。

    要得到明确答案,您需要列出编译器在第一个示例中生成的汇编代码

    我的猜测是
    X=1024*1024*Y
    没有考虑到存储结果需要使用long,而生成的代码使用ints


    Try:
    X=1024L*1024L*Y并查看您是否得到正确答案。

    如果您想使用溢出,建议使用诸如MAX_INT(如果可用)之类的常量,或者使用更多特定于系统的类型,如uint32_t,它可以明确地统计可用字节/位的数量。

    如果您想使用溢出,建议使用常量,如MAX_INT(如果可用),或使用更多系统特定类型,如uint32_t,它可以明确显示可用字节/位的数量。

    如果要处理溢出,建议使用常量,如MAX_INT(如果可用),或使用更多系统特定类型,像uint32\u t,它可以明确显示可用字节/位的数量。

    如果你想处理溢出,建议使用诸如MAX\u INT(如果可用)之类的常量,或者依赖更多系统特定的类型,比如uint32\u t,它可以明确显示可用字节/位的数量。

    • 1024*1024*drive\u gb
      表示
      (1024*1024*drive\u gb
      ,因为根据C标准,乘法是从左到右关联的
    • 1024
      表示
      (int)1024
      ,因为十进制常量有第一种类型,可以将它们放在其中(int、long、unsigned long)
    • 1024*1024
      作为两个整数的乘积,结果也将是一个整数
    • 在Arduino平台(实际上是AVR)上,INT是16位的,因此上面的产品溢出
    你可以通过写作得到正确的结果

    drive_kb = 1024*(1024*drive_gb);
    
    • 1024*1024*drive\u gb
      表示
      (1024*1024*drive\u gb
      ,因为根据C标准,乘法是从左到右关联的
    • 1024
      表示
      (int)1024
      ,因为十进制常量有第一种类型,可以将它们放在其中(int、long、unsigned long)
    • 1024*1024
      作为两个整数的乘积,结果也将是一个整数
    • 在Arduino平台(实际上是AVR)上,INT是16位的,因此上面的产品溢出
    你可以通过写作得到正确的结果

    drive_kb = 1024*(1024*drive_gb);
    
    • 1024*1024*drive\u gb
      表示
      (1024*1024*drive\u gb
      ,因为根据C标准,乘法是从左到右关联的
    • 1024
      表示
      (int)1024
      ,因为十进制常量有第一种类型,可以将它们放在其中(int、long、unsigned long)
    • 1024*1024
      作为两个整数的乘积,结果也将是一个整数
    • 在Arduino平台(实际上是AVR)上,INT是16位的,因此上面的产品溢出
    你可以通过写作得到正确的结果

    drive_kb = 1024*(1024*drive_gb);
    
    • 1024*1024*drive\u gb
      表示
      (1024*1024*drive\u gb
      ,因为根据C标准,乘法是从左到右关联的
    • 1024
      表示
      (int)1024
      ,因为十进制常量有第一种类型,可以将它们放在其中(int、long、unsigned long)
    • 1024*1024
      作为两个整数的乘积,结果也将是一个整数
    • 在Arduino平台(实际上是AVR)上,INT是16位的,因此上面的产品溢出
    你可以通过写作得到正确的结果

    drive_kb = 1024*(1024*drive_gb);
    

    谢谢你的评论!我一直试图通过在命令提示符中使用avr objdump-S来获取汇编代码,但我认为它无法识别该命令。是否有更好的方式查看汇编代码?谢谢您的评论!我一直试图通过在命令提示符中使用avr objdump-S来获取汇编代码,但我认为它无法识别该命令。有b吗