unsigned int

На платах Arduino Uno и других платах на основе ATMEGA тип данных unsigned int (целые числа без знака) совпадает с типом int в том, что они хранят 2-байтовое значение. Однако вместо хранения отрицательных чисел они хранят только положительные значения, что дает полезный диапазон от 0 до 65 535 ((2 ^ 16) - 1).

В Arduino 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, а также наоборот:

unsigned int x;
x = 0;
x = x - 1; // В переменной x сейчас находится число 65535 - число вышло за пределы в отрицательном направлении.
x = x + 1; // В переменной x сейчас 0 - произошло переполнение.

Вычисления с беззнакомыми переменными могут привести к неожиданным результатам, даже если ваша переменная без знака никогда не переполнится.

MCU применяет следующие правила:

Расчет производится в области действия целевой переменной. Например, если переменная назначения подписана, она выполнит математические вычисления со знаком, даже если обе входные переменные не подписаны.

Однако при расчете, который требует промежуточного результата, область действия промежуточного результата не указывается кодом. В этом случае MCU выполнит математику без знака для промежуточного результата, потому что оба входа без знака!

unsigned int x = 5;
unsigned int y = 10;
int result;

result = x - y; // 5 - 10 = -5, как ожидалось
result = (x - y) / 2; // 5 - 10 в беззнаковой математике это 65530! 65530/2 = 32765

// Решение: используйте переменные со знаком или выполняйте вычисления шаг за шагом.
result = x - y; // 5 - 10 = -5, как ожидалось.
result = result / 2; // -5/2 = -2 (только целочисленная математика, десятичные разряды сбрасываются)

Этот тит данных будет полезен для счетчиков, когда необходимо обнуление переменной. В общем случае, переменная со знаком слишком мала, если вы хотите избежать потери памяти и скорости - используйте long или float.