intが2バイトしかないのはなぜですか?


9

他のプラットフォームでC / C ++を使用する場合、intタイプは通常4バイト(または潜在的にそれ以上)です。ただし、Arduinoでは2バイトのみです。

なぜ違うのですか?long代わりに常に4バイトを使用すると、パフォーマンスに影響しますか?


2
ノートintArduinoのために4バイトです。shortすべての既存のArduniosではA は2バイトになりますが、int16_tまたはを使用する他の人のアドバイスを強調しますuint16_t
Ron

回答:


10

多くの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などのネイティブ型に切り替えます。


3
注:intをint16_tにマップしたのはArduinoチームではなく、「int」はC / C ++の予約済みキーワードであり、型マッピングはABI(gcc.gnu.org/wiki/avr-gcc)の一部であり、 avr-gccコンパイラの開発者がフォローすることを決定しました。もう1つの顕著な違いは、通常64ビット幅の「double」タイプですが、avr-gccでは「float」のように32ビットです
cmaglie

ありがとう。なぜそれを書いたのかわかりません。私はintが32,678-> +32,767を表す必要があることを知っています(実際には、NECプロセッサの1つにこれに従わない独自のコンパイラがあったと思います)。組み込みシステムで幅を非表示にしたくないためだと思います。int16_tを使用する方がはるかに明確です。
サイバーギボンズ2014

1
明確なネイティブ型を使用するための+1!Arduino Dueでは、int32ビットです!arduino.cc/en/Reference/int
Ron

3

CおよびC ++言語に関する重要な事実の1つは、それぞれの標準が整数型および浮動小数点型のサイズ(バイト単位)を定義していないことです。

最小範囲とこれらの範囲間の関係を定義するだけです。

range(short) <= range(int) < range(long)

したがって、たとえば、intwillのサイズは通常次の要素に依存します。

  • ターゲットプラットフォーム(プロセッサ)
  • コンパイラ自体

あなたsizeof(short) == sizeof(int) == sizeof(long)は可能だと言っていますか?
ロン

@ ron-e理論的には可能です。しかし、実際にはそれを見たことはありません。ほとんどのコンパイラ/プラットフォームでは、(強制されていませんが)が予想されsizeof(short) < sizeof(long)ます。
jfpoilpret 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.