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ビットです。
コメント
-
int
とlong
? - 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ビット幅であることが保証されています)。コンパイルターゲットとして選択したプロセッサでは、int
とlong
の両方が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
が進むべき道のようです…