Arduinoでのデータ型intとlongの違い

void障害物ロボットのプログラミングを学んでいましたが、コードlongとintの2つのデータ型を見ました。

Intは、-2,147,483,648から2,147,483,647を保持するデータ型です。 longも-2,147,483,648から2,147,483,647を保持するデータ型です。

Intとlongは同じですが、以下に示すように2つのタイプのデータ型を使用するコードを思いつきました。 “7c70f69706″>

しかし、どのデータ型をいつ使用するかをどうやって知ることができますか? Webでたくさん検索しましたが、理解できなかったので、誰かに説明してもらえますか。

コメント

  • " Intは、-2,147,483,648から2,147,483,647を保持するデータ型です" どこでそれを聞きましたか?

回答

Arduino(AVRモデル)では、intは32ビットではなく16ビットです。したがって、-32768から+32767になります。

これはの違いです。 82d008b4c7 “>

これは32ビットです。

コメント

  • intlong
  • Dueではintは32ビットで、longと同じです。たとえば、ここを参照してください。

回答

16 ビット not 32.

回答

C言語仕様による、intは16ビット以上、longは32ビット以上である必要があります。

コンパイラがintを32ビットまたは64ビットとして実装しても問題ありません。コンパイラがlongを64ビット以上で実装しても問題ありません。ただし、コンパイラがlongを16ビットとして実装することは許可されていません。

では、いつどのタイプを使用するのですか?

値が作業するのは16ビット以内で表すことができるので、intを使用しても問題ありません。16ビットを超える必要がある場合はlong。32ビット以上が必要な場合は、long longを使用してください。

コンパイラやCPUの詳細に追いつかないでください。他の人が述べているように、同じ製品範囲であるArduinosには、16ビットと32ビットのCPUがあります。代わりに、標準が保証するものだけを信頼してください。

Cのタイプの完全な仕様は次のとおりです。

  • charは8ビット以上である必要があります
  • intは16ビット以上である必要があります
  • longは32ビット以上である必要があります
  • long longは64ビット以上である必要があります

注:コンパイラがchar、int、long、およびlonglongを実装することは完全に合法です。 64ビットとして。これは実際、DSP間では珍しいことではありません。

コメント

  • また、コンパイラのドキュメントを読んでください
  • そして:

    。したがって、intが64ビットの場合、longも64ビット以上である必要があります。

回答

これはCと同じ理由です。intタイプのサイズが予想されますシステムが最も効率的に処理する自然なワードサイズである必要があります。また、幅が16ビット以上、short以上、それ以下である必要があります。 longよりも。

したがって、intは、16ビット、32ビット、または64ビットベースの場合があります。システムが最適に処理するものなら何でも、8ビットまたは16ビットCPUでは16ビット幅、32ビットCPUでは32ビット幅になる可能性が高いです。

int最高のパフォーマンスが必要な場合、16ビットよりも広い範囲が必要な場合は注意が必要です。最近では、16ビットシステム用のアプリケーションコードを作成していることを知っている傾向があります。ただし、移植性が高い「ライブラリ」コードには当てはまりません。より大きな懸念。

あなたの例では、作成者がタイプを慎重に選択したと仮定すると、int変数はおそらく小さな範囲を必要とし、ワードサイズにする余裕があります、潜在的に短いまたは速いコード(またはその両方)につながります。 longのものは、おそらく16ビット以上の範囲を必要としました(少なくとも32ビット幅であることが保証されています)。コンパイルターゲットとして選択したプロセッサでは、intlongの両方が32ビットとして実装されているようです。 16ビットのターゲットCPUを選択した場合は、異なる(またはすべき)。

回答

stdint.hの型を使用するのが好きです。

これらには小さな欠点がありますが、他のアーキテクチャでコンパイルする場合でも、処理しているサイズを正確に把握できるという利点があります。

#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc. 

ただし、データにint16_tしか必要ない場合は、明らかにint32_tの束を移動したくないでしょう。

コメント

  • したがって、マシンワードを使用しないでください。サイズはAVRのパフォーマンスに影響しませんか?
  • @Ren é-通常、ワードサイズを使用しないと、ほとんどのCPUのパフォーマンスに影響する可能性があります。ただし、従来のAVRCPUには8ビットレジスタがあります&アキュムレータとポインタ操作用の16ビット命令があります。したがって、プログラミングするときは、最初にコードを実行してから、速度を最適化します if it 'が遅すぎます。
  • @Ren é-しかし、本当にそれについてペダンシーになりたい場合は、データ型としてword。これは、Arduino Unoでは16ビット、Arduino Due &ゼロでは32ビットです。しかし、これは、データ型の最小サイズしかわからないという問題に戻ります。一部のDueコードでwordを使用しているが、その後Unoにバックポートしたいとしますか?!代わりにuint32_tを使用すると、開始する前にこの問題を解決できますが、はい、Unoではワードサイズが最適ではありません。 将来のArduinoボードはどうですか…どのようなワードサイズになりますか? 32? 64? 128!?
  • わかりました。したがって、下限が十分である場合はマシンワードサイズ(int?WORDは廃止されたWindowsタイプ定義のようです)を使用します。メモリサイズは気にせず、速度も必要です。サイズが気になる場合は* _t?
  • それをスクラップ… gnu.org/software/libc/manual/html_node/Integers.html *fast*_tが進むべき道のようです…

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です