説明
Unoやその他のATMEGAベースのボードでは、unsigned int(unsigned integers)は2バイトの値を格納する点ではintと同じです。しかし、負の数を格納する代わりに正の値のみを格納し、0~65,535((2^16)-1)の有用な範囲が得られます。
一方、Dueは4バイト(32ビット)の値を格納し、0~4,294,967,295(2^32 – 1)の範囲になります。
符号なし整数と(符号付き)整数の違いは、最上位ビット(「符号」ビットと呼ばれることもある)の解釈方法にあります。Arduinoのint型(符号付き)では、上位ビットが「1」の場合、数値は負の数として解釈され、他の15ビットは(2の補数)で解釈されます。
構文
unsigned int var = val;
パラメータ
var: 変数名。
val: その変数に割り当てる値。
コード例
unsigned int ledPin = 13;
注意点と警告
符号なし変数が最大容量を超えた場合、「ロールオーバー」して0に戻ったり、逆に0に戻ったりします。
unsigned int x; x = 0; x = x - 1; // x now contains 65535 - rolls over in neg direction x = x + 1; // x now contains 0 - rolls over
unsigned intを使った演算は、unsigned intがロールオーバーしない場合でも、予期しない結果になることがあります。
MCUは以下のルールを適用しています。
計算は出力先の変数のスコープ内で行われます。例えば、出力先の変数が符号付きであれば、両方の入力変数が符号なしであっても、符号付きの計算を行います。
しかし、中間結果を必要とする計算では、中間結果のスコープはコードによって指定されていません。この場合、MCUは中間結果を符号なしで計算します。なぜなら、両方の入力が符号なしだからです
unsigned int x = 5; unsigned int y = 10; int result; result = x - y; // 5 - 10 = -5, as expected result = (x - y) / 2; // 5 - 10 in unsigned math is 65530! 65530/2 = 32765 // solution: use signed variables, or do the calculation step by step. result = x - y; // 5 - 10 = -5, as expected result = result / 2; // -5/2 = -2 (only integer math, decimal places are dropped)
なぜ、unsigned int(符号なし変数)を使うのか?
カウンタなどでロールオーバーの動作が必要な場合
符号付き変数では少し小さすぎるが、long/floatのメモリと速度の損失を避けたい。