他のプラットフォームでC / C ++を使用する場合、int
タイプは通常4バイト(または潜在的にそれ以上)です。ただし、Arduinoでは2バイトのみです。
なぜ違うのですか?long
代わりに常に4バイトを使用すると、パフォーマンスに影響しますか?
他のプラットフォームでC / C ++を使用する場合、int
タイプは通常4バイト(または潜在的にそれ以上)です。ただし、Arduinoでは2バイトのみです。
なぜ違うのですか?long
代わりに常に4バイトを使用すると、パフォーマンスに影響しますか?
回答:
多くのArduinoで使用されているATmega328は、8ビットマイクロコントローラです。つまり、レジスタは8ビット、データバスは8ビット、ポートは8ビットです。システムにはいくつかの最小限の16ビットアスペクト(たとえば、タイマーの1つ)がありますが、ほとんどすべてが8ビットです。
したがって、ほとんどの操作は一度に8ビットを処理します。8ビット(つまり、16ビットまたは32ビットの整数と浮動小数点数)以外のものを扱うには、コンパイラーが複数の命令を使用してこれらの大きな変数を処理する、ソフトウェアエミュレーションと本質的に説明できるものが必要です。
8ビットは、8ビットポートをアドレス指定するには明らかに適切です。また、多くのループカウンター、戻り値、ASCII文字を処理するのに十分です。数値を扱う場合は、それだけでは十分ではありません。符号付き8ビット整数(int8_t)は、-128-> +127のみを表すことができます。符号なし(uint8_t)は0-> 255のみを表すことができます。
8ビット整数は非常に制限があります。C / C ++ intは、少なくとも-32,678-> +32,767を表す必要があるため、int16_tにマップします-そのようにする最小サイズ。これにより、範囲と効率のバランスが良くなります。これは初心者が学習しているときに特に重要です-オーバーフローは実際にはプログラマー以外が理解するものではありません。
ただし、ほとんどの16ビット操作には8ビット操作の少なくとも2倍の時間がかかり、2倍の数のレジスターを使用するため、これにはパフォーマンスへの影響があります。これはあなたに違いをもたらすかもしれませんし、しないかもしれません。
私たちの多くは、int8_tやuint8_tなどのネイティブ型に切り替えます。
int
32ビットです!arduino.cc/en/Reference/int
CおよびC ++言語に関する重要な事実の1つは、それぞれの標準が整数型および浮動小数点型のサイズ(バイト単位)を定義していないことです。
最小範囲とこれらの範囲間の関係を定義するだけです。
range(short) <= range(int) < range(long)
したがって、たとえば、int
willのサイズは通常次の要素に依存します。
sizeof(short) == sizeof(int) == sizeof(long)
は可能だと言っていますか?
sizeof(short) < sizeof(long)
ます。
int
Arduinoのために4バイトです。short
すべての既存のArduniosではA は2バイトになりますが、int16_t
またはを使用する他の人のアドバイスを強調しますuint16_t
。