unsigned int

説明

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のメモリと速度の損失を避けたい。

タイトルとURLをコピーしました